Почему иногда фоновые процессы 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.
Ответы
Ответ 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, что привело к его завершению (как вы заметили)
Надеюсь, что это поможет