Перенаправление stdout & stderr из фонового процесса - PullRequest
4 голосов
/ 28 ноября 2010

У меня есть скрипт с именем foo, который запускает программу a.exe и отправляет статистику времени в файл time.log

#!/bin/bash
date 1>> time.log
(time ./a.exe) 2>> time.log

Это работает, если я запускаю скрипт в фоновом режиме моего терминалаи держите мою оболочку открытой до тех пор, пока не завершится работа a.exe, но если я запустлю скрипт в фоновом режиме и выйду из своего терминала (a.exe займет много времени)

foo & 
exit

при возвращении.exe выполнен, но статистика времени не отображается в моем файле журнала.Кто-нибудь знает, почему это?Есть ли способ получить статистику по времени после закрытия родительской оболочки?

спасибо

Ответы [ 5 ]

5 голосов
/ 28 ноября 2010
nohup foo &

Когда вы выходите из своей оболочки, она посылает сигнал SIGHUP всем дочерним процессам, который по умолчанию убивает их. Если вы хотите, чтобы процесс продолжал выполняться даже при выходе из родительской оболочки, вам нужно, чтобы он игнорировал SIGHUP.

ИМЯ

nohup - вызвать команду, невосприимчивую к зависаниям

СИНТАКСИС

nohup utility [arg ...]

ОПИСАНИЕ

Утилита nohup вызывает команду со своими аргументами и в это время устанавливает сигнал SIGHUP, который будет игнорироваться. Если стандартный вывод является терминалом, стандартный вывод добавляется к файлу nohup.out в текущем каталоге. Если стандартной ошибкой является терминал, она направляется в то же место, что и стандартный вывод.

2 голосов
/ 28 ноября 2010

Поскольку вопрос также помечен как bash, я цитирую man bash

disown [-ar] [-h] [jobspec ...]
          Without  options,  each  jobspec  is  removed  from the table of
          active jobs.  If jobspec is not present, and neither -a  nor  -r
          is  supplied, the shell's notion of the current job is used.  If
          the -h option is given, each jobspec is not removed from the ta‐
          ble,  but is marked so that SIGHUP is not sent to the job if the
          shell receives a SIGHUP.  If no jobspec is present, and  neither
          the  -a  nor the -r option is supplied, the current job is used.
          If no jobspec is supplied, the -a option means to remove or mark
          all  jobs;  the  -r  option without a jobspec argument restricts
          operation to running jobs.  The return value is 0 unless a  job‐
          spec does not specify a valid job.

Это удобно, когда вы начали работу, но забыли добавить к ней префикс nohup. Просто сделай

disown -ah
disown -a
0 голосов
/ 10 декабря 2010

Ваш a.exe убивается при закрытии родительской оболочки.

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

Джон дал гораздо лучший ответ - используйте nohup.

0 голосов
/ 28 ноября 2010

Не забудьте удалить все ссылки на tty / pts, 0 </ dev / null удаляет ссылку на стандартный ввод. </p>

0 голосов
/ 28 ноября 2010

Попробуйте:

nohup <your_command> &
...