2009-04-20 3 views
6

tar -xvzf $ filename.tar.gz || {exit $ ?; }Код ошибки 141 с tar

Вот мои скрипты будут выходить с ERRORCODE 141. Я использую Fedora Core 6 с тар версии 1,15

это обыкновение случаться все время, но более 70 процентов времени он терпит неудачу.

ответ

0

В качестве обходного пути мы теперь используем cpio для архивирования, который отлично подходит для нас сейчас, хотя я хотел бы знать, почему tar вызывает эту проблему, ее долгое время и используется в качестве стандартного инструмента в течение многих лет.

1

GNU tar возвращает только несколько вещей, ни одна из которых не была -141. однако, если он работает подпроцессом, например gzip, и этот процесс прерывается ненормально, он возвращает , что код возврата.

Я не уверен, что подпроцесс мог быть, хотя. попробуйте его с помощью --verbose и посмотрите, есть ли у вас какие-либо подсказки.

+0

Я изменил свои сценарии, чтобы сделать gunzip $ filname.tar.gz; tar -xvf $ filename.tar снова его детонация, которая терпит неудачу с 141 –

+0

Вы пытались запустить его с помощью --verbose, и вы получили какие-либо подсказки?tar также запускает rmt для удаленных лент; прерывистая проблема может быть проблемой сети с ленточными накопителями. Знать, какая ОС вы используете, может помочь. –

+0

О, не обращай внимания на ОС, я вижу это сейчас. –

15

Я понимаю, что эта тема более чем на несколько лет, но я комментирую тех людей, которые наткнулись на эту тему с ошибкой.

Всякий раз, когда вы используете параметр сжатия, 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 на этом компьютере, может ли этот же компьютер извлечь эти файлы без ошибки?

+0

спасибо! имеет смысл. я получил ошибку 141 при использовании tar -xzf в сеансе nohup, который был запущен процессом, который был убит командой, только предшествующей команде tar. мое решение заключалось в том, чтобы отложить убийство родительского процесса дочерним процессом до момента извлечения tarball. возможно, что перенаправление вывода tar может помочь, но я не пытался. –

+0

Это также может произойти, когда выход «tar» подается в другой процесс, который закрывает трубку раньше, например, 'tar -tf x.tar | head' или 'tar -tf x.tar | grep -q .' ('head' закрывает трубу после прочтения указанного количества строк,' grep -q' закрывает трубу, как только будет замечен шаблон.) – bain