tar -xvzf $ filename.tar.gz || {exit $ ?; }Код ошибки 141 с tar
Вот мои скрипты будут выходить с ERRORCODE 141. Я использую Fedora Core 6 с тар версии 1,15
это обыкновение случаться все время, но более 70 процентов времени он терпит неудачу.
tar -xvzf $ filename.tar.gz || {exit $ ?; }Код ошибки 141 с tar
Вот мои скрипты будут выходить с ERRORCODE 141. Я использую Fedora Core 6 с тар версии 1,15
это обыкновение случаться все время, но более 70 процентов времени он терпит неудачу.
В качестве обходного пути мы теперь используем cpio для архивирования, который отлично подходит для нас сейчас, хотя я хотел бы знать, почему tar вызывает эту проблему, ее долгое время и используется в качестве стандартного инструмента в течение многих лет.
GNU tar возвращает только несколько вещей, ни одна из которых не была -141. однако, если он работает подпроцессом, например gzip, и этот процесс прерывается ненормально, он возвращает , что код возврата.
Я не уверен, что подпроцесс мог быть, хотя. попробуйте его с помощью --verbose
и посмотрите, есть ли у вас какие-либо подсказки.
Я понимаю, что эта тема более чем на несколько лет, но я комментирую тех людей, которые наткнулись на эту тему с ошибкой.
Всякий раз, когда вы используете параметр сжатия, tar неявно открывает соединение с базовой программой, используя канал. Итак, в примере OP: tar -xvzf $filename.tar.gz
, то, что на самом деле сделает tar, это запустить что-то похожее на это: gunzip $filename.tar.gz | tar -xv -
. Вы можете проверить это, запустив top
, где вы увидите два процесса (один для tar и один для gzip).
Иногда, хотя сам трубопровод ломается. Например, если файл не является файлом gzip. Возьмите это, например: tar -xvzf somefile.iso
, что эквивалентно gunzip somefile.iso | tar -xv -
. В такой ситуации gzip выйдет из строя. Когда ошибки gzip выходят из строя, трубопровод разрывается. Другая возможность была бы в том случае, если файл gzip был прав, но файл tar внутри него был поврежден. В этом случае gzip начинает отправлять несжатый поток в tar, но затем tar понимает, что что-то не так и закрывает поток. gzip здесь будет выходить из строя, потому что его вывод закрыт.
В значениях выхода значение выше 128 указывает на завершение из-за сигнала, а сумма выше 128 означает, какой сигнал вызвал завершение. Итак, если мы вычитаем 128 из кода выхода OP из 141, получаем 13, что соответствует SIGPIPE (man 7 signal
для списка стандартных сигналов и их соответствующих целочисленных значений).
На странице руководства представлен комментарий SIGPIPE как «Сломанная труба: пишите в трубу без считывателей». Итак, похоже, что gzip пытается записать в трубку, но tar перестает слушать. Я предполагаю, что gzip распаковывает файл успешно, но несжатый поток не является допустимым tar-архивом. Моим советом здесь было бы запустить gunzip в файле, а затем запустить tar в файле результатов и посмотреть, с какой ошибкой (на основе SIGPIPE, я думаю, что это не сработает). В любом случае, похоже, что файлы не читаются этими версиями инструментов (как коррупция, так и конфликт версий).
Как делались эти файлы (какие варианты для tar и т. Д.)? Созданы ли они на этой машине или другой машине? Если вы создаете файл .tar.gz на этом компьютере, может ли этот же компьютер извлечь эти файлы без ошибки?
спасибо! имеет смысл. я получил ошибку 141 при использовании tar -xzf в сеансе nohup, который был запущен процессом, который был убит командой, только предшествующей команде tar. мое решение заключалось в том, чтобы отложить убийство родительского процесса дочерним процессом до момента извлечения tarball. возможно, что перенаправление вывода tar может помочь, но я не пытался. –
Это также может произойти, когда выход «tar» подается в другой процесс, который закрывает трубку раньше, например, 'tar -tf x.tar | head' или 'tar -tf x.tar | grep -q .' ('head' закрывает трубу после прочтения указанного количества строк,' grep -q' закрывает трубу, как только будет замечен шаблон.) – bain
Я изменил свои сценарии, чтобы сделать gunzip $ filname.tar.gz; tar -xvf $ filename.tar снова его детонация, которая терпит неудачу с 141 –
Вы пытались запустить его с помощью --verbose, и вы получили какие-либо подсказки?tar также запускает rmt для удаленных лент; прерывистая проблема может быть проблемой сети с ленточными накопителями. Знать, какая ОС вы используете, может помочь. –
О, не обращай внимания на ОС, я вижу это сейчас. –