Подтвердить что ты не робот

Почему иногда фоновые процессы unix умирают, когда я выхожу из своей оболочки?

Я хотел знать, почему я вижу другое поведение в фоновом процессе в Bash shell

Случай 1: Вход на сервер Unix с использованием Putty (SSH)

  • По умолчанию используется оболочка csh
  • Я изменил на Bash shell
  • введите пароль 2000 и
  • нажмите enter

Он дал мне номер задания. Теперь я убил свою сессию, нажав x в окне шпатлевки Теперь откройте еще один сеанс и попытайтесь найти процесс. Процесс умер.

Случай 2: Случай 1: Зашел на сервер Unix с использованием Putty (SSH) По умолчанию используется оболочка csh

  • Я изменил на Bash shell
  • vi mysleep.sh
  • sleep 2000 и сохраненный mysleep.sh
  • ./mysleep.sh

Diff здесь... вместо выполнения команды sleep непосредственно Я сохраняю команду sleep в файле и выполняю файл.

Теперь я убил свой сеанс, щелкнув x в окне шпатлевки Теперь откройте еще один сеанс и попытайтесь найти процесс. Процесс все еще существует.

Не знаю, почему это происходит. Я думал, что мне нужно сделать отключение в Bash для запуска процесса даже после выхода из системы.

Один diff, который я вижу в идентификаторе родительского процесса. Во втором случае. Идентификатор родительского процесса для сна 2000 становится 1. Похоже, как только процесс для mysleep.sh умер, ядро ​​назначил родительскому процессу 1.

4b9b3361

Ответ 1

Разница здесь действительно в промежуточном процессе. Когда вы закрываете окно терминала, на процессы, запущенные в нем, посылается сигнал HUP (связанный с "nohup" как an0nymo0usc0ward). Действие по умолчанию при получении HUP состоит в том, чтобы умереть - из сообщения (3) manpage,

 No    Name         Default Action       Description
 1     SIGHUP       terminate process    terminal line hangup

В первом примере процесс сна сразу получает этот сигнал HUP и умирает, потому что он не настроен делать что-либо еще. (Некоторые процессы захватывают HUP и используют его для выполнения некоторых действий, например, перечитывают некоторые файлы конфигурации)

Во втором примере процесс оболочки, запускающий вашу оболочку script, уже умер, поэтому процесс сна никогда не получает сигнал. В UNIX каждый процесс должен иметь родительский процесс из-за внутренних функций, как работает семейство вызовов wait (2) и действительно обрабатывает вообще. Поэтому, когда родительский процесс умирает, ядро ​​дает его init (pid 1, как вы заметили) в качестве приемного ребенка. Сиротский процесс (по Википедии) содержит дополнительную информацию об этом, также см. Zombie для получения дополнительной технической информации.

Ответ 2

Уже запущенный процесс?

^ г
Б.Г.
Отклонить% <jobid>

Новый процесс / script (на локальной консоли компьютера)?

nohup script.sh &

Новый процесс / script (на удаленной консоли компьютера)?

В зависимости от вашей потребности,
есть два варианта [будет больше;-)]

ssh remotehost 'nohup/path/to/ script.sh </dev/null > nohup.out 2 > & 1 &'

ИЛИ

использовать 'screen'

Ответ 3

Попробуйте "nohup cmd args..."

Ответ 4

Ответ Стивена верен, но я хотел бы еще раз подчеркнуть эту сложную роль:

= > Используя bash script, который просто выполняет спящий режим в фоновом режиме

Эффект от этого заключается в том, что "script" выходит почти сразу (поскольку он выполнил все свои команды). Тем не менее, он создал дочерний процесс (сон) во время его жизни. Эффект от этого заключается в том, что:

  • "script" больше не может быть родителем, а sleep - сиротой для init (который хорошо показывает в pstree).
  • Оболочка bash, в которой вы запустили script, больше не имеет базовых заданий

Обратите внимание, что все это происходит, когда вы выполняете script и не имеете никакого отношения к закрытию ssh logout/putty.

Когда вы, наконец, закроете сеанс шпатлевки, bash получит "SIGHUP", но не перенаправляет его ни на какой другой процесс (так как осталось никаких заданий) В другом случае bash все еще осталось задание, которое затем отправило SIGHUP, что привело к его завершению (как вы заметили)

Надеюсь, что это поможет