Как ко времени выполнения на нескольких командах И записи вывод времени в файл?

Мое предложение за два цента: Вы могли использовать PAM, чтобы сделать это.

Например, Использование некоторый pam модуль как pam-mysql для хранения некоторых пользователей в mysql и pam_require, чтобы избежать, чтобы mysql-сохраненные пользователи могли получить доступ кроме sftp сервиса.

Начните смотреть здесь: модули/Приложения, доступные или происходящие...

69
09.02.2016, 01:45
3 ответа

Использовать sh -c 'commands' как команда, например:

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
93
27.01.2020, 19:31

Попробуйте это:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

Объяснение:

Во-первых, мы должны найти способ перенаправить вывод time. С тех пор time встроенная оболочка, она берет полную командную строку в качестве команды, которая будет измеряться, включая перенаправления. Таким образом,

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[Примечание: комментарий janos подразумевает дело обстоит не так для bash.] Мы можем достигнуть перенаправления timeпроизведенный путем выполнения time в подоболочке и затем перенаправлении вывода той подоболочки.

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

Теперь мы успешно перенаправили вывод time, но его вывод смешан с выводом ошибок команды, которую мы измеряем. Для разделения этих двух мы используем дополнительный дескриптор файла.

На "внешней стороне" мы имеем

% (time ... ) 3>&2 2>timeout

Это означает: то, независимо от того, что записано в дескриптор файла 3, будет произведено к тому же дескриптору файла места 2 (стандартная погрешность), производит теперь (терминал). И затем мы перенаправляем стандартную погрешность в файл timeout.

Таким образом, теперь мы имеем: все записанное в stdout и fd 3 перейдет к терминалу, и все записанное в stderr перейдет к файлу. То, что оставляют, должно перенаправить stderr измеренной команды к fd 3.

% (time whatever 2>&3) 3>&2 2>timeout

Теперь, чтобы заставить время измерить больше чем одну команду, мы должны выполнить их в (другой!) подоболочка (в круглых скобках). И перенаправить вывод ошибок всех их к fd 3, мы должны сгруппировать их в фигурных скобках.

Так, наконец, мы прибываем в:

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

Именно.

9
27.01.2020, 19:31
  • 1
    Это - синтаксическая ошибка в оболочке POSIX. Вероятно, bashism? –  josch 01.08.2017, 09:00
  • 2
    @josch оболочка, используемая здесь, является zsh. –  angus 28.08.2017, 16:22

Неправильный ответ, но очень связанный с вопросом.
Получить статистику времени для нескольких программ, объединенных круглыми скобками. Разделяйте команды точкой с запятой ; или && , если команда 2 должна выполняться только тогда, когда команда 1 завершилась без ошибки:

time ( command1 ; command2 )

time ( command1 && command2 )
21
27.01.2020, 19:31

Теги

Похожие вопросы