2017-01-03 6 views
0

Я недавно обнаружил GNU-параллель, и это уже невероятно полезно, но я не могу понять, как получить весь мой вывод в любой вид полезной структуры. Вот мои вопросы:GNU parallel stderr с --files или sensible --result tree

  • команды я бегу занять несколько часов или дней и производить кипы вывода на стандартный вывод, так и часто STDERR, поэтому я хочу, чтобы перенаправить все выходные данные
  • звучит как - файлы должны работать, не так ли? Но если я не сумасшедший, я получаю только stdout из этих файлов. Stderr просто сбрасывается с этой опцией ???
  • Хорошо, как насчет - результаты? Это может быть немного лучше, но имеет две проблемы:
    1. Команды длинны:/путь/в/команда -a -blah/path/to/data/another/path {}. Это делает смешное имя каталога, а пробелы делают попытку сделать что-либо боль (например, «cat` find. -name stdout` »не будет работать)
    2. stdout и stderr идут в отдельные файлы, что обычно нормально, но в этом случае сообщения об ошибках иногда производятся в середине другого выхода, и попытка собрать вещи обратно вместе - это боль.

Итак: есть ли способ в параллели, то есть без того, чтобы изменить свою команду либо получить поток ошибок при использовании --files или сил --results использовать осмысленные имена каталогов?

EDIT: В ответ на комментарий, я пытался:

find controlFiles/ -name "*.txt" | parallel --files --tmpdir logs --tagstr {/.} -j15 --joblog logs/joblog --eta /path/to/command --opt --opt2 /path/to/data /path/to/output {} > logs/logfiles.txt 

и

find controlFiles/ -name "*.txt" | parallel --files --results logs --tagstr {/.} -j15 --joblog logs/joblog --eta /path/to/command --opt --opt2 /path/to/data /path/to/output {} > logs/logfiles.txt 

где бывший теряет STDERR, а второй производит непригодные имена каталогов

EDIT2: После того, как группа провела больше испытаний, мне кажется, что я как-то добрался до действительно w странное состояние. Структура каталогов из -results должна быть названа после аргументов, но каким-то образом моя использовала всю команду. Когда я попытался удалить существующий каталог журналов и начать с того, что, как я думал, является той же командой, я получил ожидаемое поведение. Все еще не идеальный, но я, конечно, могу жить с ним.

+0

Можем ли мы увидеть, как вы призываете параллельная команда? – Inian

ответ

2

Наиболее очевидным решением является переименование длинной части каталога после выполнения заданий.

cd resultdir/1/ 
rename 's:long/common/string/to/remove::' */2/* 

Другая идея заключается в том, чтобы использовать новый выход .csv (доступный от 20161222):

parallel --results foo.csv ... 

, который будет генерировать CSV-файл с содержимым из --joblog, то аргументы, стандартный вывод, и stderr. Это особенно удобно, если вы хотите опубликовать его в R или LibreCalc.

Если вы предпочитаете смешивать STDERR/STDOUT, просто пусть 2> & 1 быть частью вашей команды:

parallel '(echo joe; ls /doesnotexists {}) 2>&1' ::: bar > foo 

С версии 20170122 вы можете:

parallel --results out/{/.} mycommand 
+0

Я не думаю, что вариант CSV будет хорошо работать, когда каждая команда делает страницы вывода, но +1 для команды переименования, о которой я как-то никогда не слышал раньше! – thegreatemu

+0

CSV-вывод работает правильно с символами новой строки. Пока у вас есть ОЗУ для хранения вывода одного задания в памяти, тогда CSV-выход будет работать нормально. –

 Смежные вопросы

  • Нет связанных вопросов^_^