Как препятствовать тому, чтобы фоновый процесс был остановлен после закрытия клиента SSH в Linux

Я работаю над машиной Linux через SSH (Шпаклевка). Я должен оставить процесс, работающий в течение ночи, таким образом, я думал, что мог сделать это путем запуска процесса в фоне (с амперсандом в конце команды) и перенаправления stdout в файл.

К моему удивлению это не работает. Как только я закрываю окно Putty, процесс останавливается.

Как я могу предотвратить это??

283
задан jww 31 July 2019 в 09:50
поделиться

9 ответов

Проверьте" nohup" программа.

297
ответ дан JesperE 23 November 2019 в 01:53
поделиться

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

, Если бы этот процесс должен регулярно выполняться и у Вас есть достаточный доступ на сервере, более оптимальный вариант состоял бы в том, чтобы использовать крон выполнение задание. Вы могли также использовать init.d (супер демон) для запуска процесса в фоновом режиме, и это может завершиться, как только это сделано.

5
ответ дан Dana the Sane 23 November 2019 в 01:53
поделиться

Как другие отметили, для выполнения процесса в фоновом режиме так, чтобы можно было разъединиться от сессии SSH, у Вас должен быть фоновый процесс, правильно разъединяют себя с его терминалом управления - который является pseudo-tty, который использует сессия SSH.

можно найти информацию о процессах daemonizing в книгах, таких как "Программа Передовой сети Stevens, Vol 1, 3-й Edn" или "Усовершенствованное Программирование Unix Rochkind".

я недавно (в последних годах) должен был иметь дело с упорной программой, которая не сделала самого daemonize правильно. Я закончил тем, что имел дело с этим путем создания универсальной daemonizing программы - подобный nohup, но с большим количеством доступных средств управления.

Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
  -V          print version and exit
  -a          output files in append mode (O_APPEND)
  -b          both output and error go to output file
  -c          create output files (O_CREAT)
  -d dir      change to given directory
  -e file     error file (standard error - /dev/null)
  -h          print help and exit
  -i file     input file (standard input - /dev/null)
  -k fd-list  keep file descriptors listed open
  -m umask    set umask (octal)
  -o file     output file (standard output - /dev/null)
  -s sig-list ignore signal numbers
  -t          truncate output files (O_TRUNC)
  -p          print daemon PID on original stdout
  -x          output files must be new (O_EXCL)

двойной тире является дополнительным в системах, не используя GNU getopt () функция; это необходимо (или необходимо определить POSIXLY_CORRECT в среде) на Linux и т.д. Начиная с работ двойного тире везде, лучше использовать его.

можно все еще связаться со мной (firstname, отмечают точкой lastname в com точки Gmail), если Вы хотите источник для daemonize.

Однако код теперь (наконец) доступен на GitHub в моем SOQ (Вопросы о Переполнении стека) репозиторий как файл daemonize-1.10.tgz в эти пакеты подкаталог.

11
ответ дан Jonathan Leffler 23 November 2019 в 01:53
поделиться

Лично, мне нравится 'пакетная' команда.

$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D

Это наполняет его в к фону, и затем отправляет результаты по почте Вам. Это - часть крона.

17
ответ дан Will Hartung 23 November 2019 в 01:53
поделиться
nohup blah &

Замена Ваше имя процесса вздора!

34
ответ дан Nathan Fellman 23 November 2019 в 01:53
поделиться

Когда сеанс закрыт, процесс получает сигнал SIGHUP, который это, по-видимому, не ловит. Можно использовать эти nohup команда при запуске процесса или удара встроенная команда disown -h после запуска процесса для предотвращения этого:

> help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.
79
ответ дан Robert Gamble 23 November 2019 в 01:53
поделиться

Я рекомендовал бы использовать Экран GNU. Это позволяет Вам разъединяться с сервера, в то время как все Ваши процессы продолжают работать. Я не знаю, как я жил без него, прежде чем я знал, что это существовало.

164
ответ дан gpojd 23 November 2019 в 01:53
поделиться

Экран Use. Это очень просто в использовании и работает как vnc на терминалы. http://www.bangmoney.org/presentations/screen.html

4
ответ дан Deon 23 November 2019 в 01:54
поделиться

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

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

Nohup делает процесс, который Вы запускаете неуязвимый для завершения, которое Ваша сессия SSH и ее дочерние процессы являются уничтожением на Вас выходить из системы. Команда, которую я дал, предоставляет Вам способ, которым можно сохранить изодромное с предварением из приложения в изодромном с предварением файле так, чтобы Вы могли correcly уничтожить его позже и позволили процессу бежать за Вами, вышли из системы.

5
ответ дан Naveen Vijay 23 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

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