3

Возможный дубликат:
Оставить скрипт bash запущенным на удаленном терминале, пока не залогинен?
Как полностью отсоединить процесс от терминала?

Я запускаю программу на сервере Linux, которая займет несколько дней.

Я запускаю его со своей рабочей станции с терминала SSH, так как эта программа только для командной строки.

Я хочу быть в состоянии сделать все это:

  • запустить эту программу,
  • перенаправить стандартные выводы в файлы,
  • выйдите из сеанса SSH, не прерывая процесс.

Я думал о $ ./MyProg.csh -params -foo -bar </dev/null 1>~/out.log 2>~/err.log &

Тем не менее, процесс прекращается в тот момент, когда я закрываю сеанс SSH. Моя рабочая станция работает под управлением Windows XP, и я не могу гарантировать ее работоспособность в течение нескольких дней, что требуется для обработки моих данных на сервере Linux.

Как вы могли заметить, моя программа должна быть запущена из CSH.

Можно ли сделать это ?

Благодарю.

3 ответа3

8

Вы можете или пользовательский screen или nohup

если вы выбираете screen :

screen запуска перед запуском службы:

$ screen

а затем запустите свой сервис внутри screen:

./MyProg.sh > myprog.log (или все, что вы хотите здесь).

а затем Ctrl+A D

когда ты вернулся, просто

$ screen -r

для получения дополнительной информации: http://www.gnu.org/s/screen/


про нохуп просто

nohup ./MyProg.sh > myprog.log &

1

Сделайте оболочку оболочки следующим образом:

#!/bin/sh
exec </dev/null
exec >> ~/out.log
exec 2>> ~/err.log
exec setsid ./MyProg.csh -params -foo -bar

Если вам тоже нужен PID-файл, отправьте этот скрипт оболочки в bg и прочитайте $! (PID последнего процесса bg). Вы можете сделать это, используя subshell with () в том же скрипте, как это:

#!/bin/sh
( exec </dev/null
  exec >> ~/out.log
  exec 2>> ~/err.log
  exec setsid ./MyProg.csh -params -foo -bar
) &
kill -0 $! > /dev/null 2>&1 || exit 1
echo $! > program.pid
exit 0
0

Соединение разрывается, потому что оболочка отправляет SIGHUP всем дочерним элементам при выходе. Если вы используете bash или zsh, вы можете использовать disown и оболочка больше не будет отправлять SIGHUP, а процессы останутся без изменений.

screen и setsid выше работают, но этот ответ имеет то преимущество, что не нужно помнить о необходимости делать screen перед тем, как вы что-то запустите. screen обладает большой мощностью, кроме этой, поэтому вы можете захотеть использовать его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .