После входа в систему ssh
я набираю эту команду bash
:
sleep 50000000000000 &
Тогда я kill -9
этот sleep
процесс в родительском процессе (то есть bash
). Затем окно терминала отключается одновременно.
Когда я снова вхожу в систему, я обнаруживаю, что sleep
процесс еще жив.
Вопрос : Почему sleep
процесс может выжить, когда я выхожу из системы и терминал закрывается? На мой взгляд, все, кроме демонов и nohup
программ, будут убиты во время выхода из системы. Если sleep
можно выжить таким образом, значит ли это, что я могу использовать этот метод вместо nohup
команды?
&
переведет процесс в фоновый режим (например, демон) и продолжит работу, даже если вы вышли из системы.Ответы:
Tl; др:
Если для
bash
экземпляра, порожденного порождением,ssh
не установленаhuponexit
опция, ни один процесс не будет завершен каким-либо способом при выходе / выходе из системы, и когда этаhuponexit
опция установлена, использованиеkill -9
в оболочке не является хорошей альтернативой использованиюnohup
в дочерних процессах оболочки;nohup
дочерние процессы оболочки по-прежнему будут защищать их от SIGHUP, не поступающих из оболочки, и даже если это не важноnohup
, все же следует отдавать предпочтение, поскольку это позволяет корректно завершить оболочку.В
bash
есть опция называетсяhuponexit
, что если набор сделаетbash
SIGHUP своих детей при выходе / выходе из системы;В интерактивных экземплярах без входа в систему
bash
, например вbash
экземпляре, созданном пользователемgnome-terminal
, эта опция игнорируется; установлен лиhuponexit
или не установлен,bash
дети никогда не будут вздыхатьbash
при выходе;В случаях интерактивного входа в систему,
bash
например, вbash
экземпляре, созданном пользователемssh
, эта опция не игнорируется (однако по умолчанию она не установлена); еслиhuponexit
установлено,bash
то потомки SIGHUP будут измененыbash
при выходе / выходе из системы; еслиhuponexit
не установлено,bash
то потомки не будут SIGHUPdupbash
при выходе / выходе из системы;Таким образом, в общем случае выход / выход из интерактивного
bash
экземпляра входа в систему , еслиhuponexit
не задана опция, не сделает оболочку SIGHUP дочерними, а выход / выход из интерактивногоbash
экземпляра, не входящего в систему , не сделает оболочку SIGHUP дочерними. несмотря на;Это, однако, не имеет значения в этом случае: использование
kill -9
sleep
будет существовать независимо, потому что уничтожение его родительского процесса (bash
) не оставит шансу возможности что- либо сделать с первым (например, если текущийbash
экземпляр былbash
экземпляром входа в систему) иhuponexit
опция была установлена, чтобы SIGHUP это).В добавление к этому, в отличие от других сигналов (таких как сигнал SIGHUP, отправляемый
bash
), сигнал SIGKILL никогда не передается дочерним процессам процесса, следовательно,sleep
даже не уничтожается;nohup
запускает процесс, невосприимчивый к сигналам SIGHUP, что является чем-то другим; это предотвратит зависание процесса при получении сигнала SIGHUP, который в этом случае может быть полученbash
экземпляром интерактивного входа в систему, еслиhuponexit
опция была установлена и оболочка закрыта; поэтому технически использованиеnohup
для запуска процесса в интерактивномbash
экземпляре входа в систему сhuponexit
отключенной опцией предотвратит зависание процесса при получении сигнала SIGHUP, но выход / выход из оболочки не будет SIGHUP вне зависимости от этого;В целом, однако, когда
nohup
необходимо предотвратить поступление сигналов SIGHUP из родительской оболочки, нет причин предпочитать методkill -9
on на родительском методе методомnohup
on на дочернем; вместо этого должно быть наоборот.Убийство родителя с помощью
kill -9
метода не оставляет шанса для изящного выхода из родительского процесса, в то время как запуск дочернего элемента с помощьюnohup
метода позволяет завершить родительский процесс другими сигналами, такими как SIGHUP (чтобы создать пример, который имеет смысл в контексте ребенка начали использоватьnohup
), которые позволяют ему грациозно выйти.источник
ps -e | grep process
следует перечислить процесс вместе с PID (или лучше,pgrep -x process
если вы уверены, что соответствует этот единственный процесс, а не ненужные вещи); проблема в том, что когда вы убиваете процесс, когдаkill -9
его дочерние элементы становятся собственникамиupstart
, следовательно, их первоначальный PPID теряется, а их PPID изменяется на PID выскочки, что делает их неузнаваемыми (AFAIK), но для их имени или PIDnohup
предотвратить зависание процесса при получении сигнала SIGHUP от родительского процесса? Я пытаюсь запустить процесс в фоновом режиме (в терминале оболочки PuTTY SSH)nohup <command> <arg> &
. Когда я выйду из системы, нажавX
кнопку PuTTY , фоновый процесс немедленно прекратится. Когда я выйду из системы, набравexit
в терминале оболочки PuTTY SSH, процесс продолжится в фоновом режиме.bash
по умолчанию не отправляет сигнал HUP дочерним процессам при выходе . Более подробно (спасибо @kos), он никогда не делает это для не- логинов .Вы можете настроить bash для этого при входе в систему, если установлен этот параметр
huponexit
. В терминале выполните:(это запускает новую оболочку "login")
Теперь проверьте
sleep
процесс:... не работает: он получил сигнал HUP и вышел по запросу.
источник
sleep 1000 & ; exit
вsleep
выживает? Обратите внимание , что если я процесс он будет выходить. И даже если установлено, выживает. Запутался ... (Я постараюсь лучше понять и изменить asnwer, иначе я его удалю).kill -HUP
sleep
huponexit
sleep
kill -9
это действительно не тот путь, по которому нужно идти. Это как стрельба из пистолета в телевизор, чтобы выключить его. Помимо комедийной составляющей здесь нет никаких преимуществ. Процессы не могут поймать или игнорироватьSIGKILL
. Если вы не дадите процессу завершить то, что он делает, и очистить, он может оставить поврежденные файлы (или другое состояние) и не сможет начать снова.kill -9
последняя надежда, когда ничего не работает.Что в вашем случае происходит:
Родительским процессом
sleep
является запущеннаяbash
оболочка. Когда вы используетеkill -9
bash, процесс bash не имеет возможности отправить aSIGHUP
ни одному из своих дочерних процессов, потому чтоSIGKILL
(который отправляетсяkill -9
) не может быть перехвачен процессом. Процесс сна продолжается. сон стал бесхозным процессом .Процесс init (PID 1) выполняет механизм, называемый повторением. Это означает, что процесс init теперь становится родителем этого потерянного процесса. Исключением является init, процессы могут стать его дочерними, так как он собирает процессы, которые потеряли свой исходный родительский процесс. Кстати: демон (как
sshd
) делает это, когда «в фоновом режиме».Если этого не произойдет, осиротевший процесс позже (когда закончится) станет процессом зомби. Это то, что происходит, когда
waitpid()
не вызывается (ответственность родительского процесса, который не может быть выполнен, когда этот процесс был уничтожен). вызовы initwaitpid()
в определенном интервале, чтобы избежать детей-зомби.источник
TERM
илиHUP
huponext
. И ТЕРМИН будет ждать, пока сон закончится. В случае команды сна OPs, это были бы тысячи лет =)&
Запускает процесс в фоновом режиме. Если вы напечатаетеps -ef
, вы увидите, что ID родительского процесса (PPID) вашего сна является вашим bash. Затем выйдите и войдите снова. Процесс останется запущенным после выхода из системы. После входа в систему во второй раз вы запуститеps -ef
снова. Вы увидите, что теперь родитель вашего процесса сна будет обрабатываться с идентификатором "1". Это init, родитель всех процессов.источник
Использование
&
заставит программу работать в фоновом режиме. Чтобы увидеть программу в фоновом режиме, используйтеbg
команду и снова запустите ее в качестве переднего планаfg
.Да, есть много способов сохранить работоспособность программы даже при выходе из основного терминала.
источник
huponexit
работает только для оболочек входа в систему, таких как оболочка, полученная черезssh
(а не, скажем, в оболочке, полученной черезgnome-terminal
)