Tl; др:
Почему sleepпроцесс может выжить, когда я выхожу из системы и терминал закрывается? На мой взгляд, все, кроме демонов и nohupпрограмм, будут убиты во время выхода из системы. Если sleepможно выжить таким образом, значит ли это, что я могу использовать этот метод вместо nohupкоманды?
Если для bashэкземпляра, порожденного порождением, sshне установлена huponexitопция, ни один процесс не будет завершен каким-либо способом при выходе / выходе из системы, и когда эта huponexitопция установлена, использование kill -9в оболочке не является хорошей альтернативой использованию nohupв дочерних процессах оболочки; nohupдочерние процессы оболочки по-прежнему будут защищать их от SIGHUP, не поступающих из оболочки, и даже если это не важно nohup, все же следует отдавать предпочтение, поскольку это позволяет корректно завершить оболочку.
В bashесть опция называется huponexit, что если набор сделает bashSIGHUP своих детей при выходе / выходе из системы;
В интерактивных экземплярах без входа в систему bash , например в bashэкземпляре, созданном пользователем gnome-terminal, эта опция игнорируется; установлен ли huponexitили не установлен, bashдети никогда не будут вздыхать bashпри выходе;
В случаях интерактивного входа в систему, bash например, в bashэкземпляре, созданном пользователем ssh, эта опция не игнорируется (однако по умолчанию она не установлена); если huponexitустановлено, bashто потомки SIGHUP будут изменены bashпри выходе / выходе из системы; если huponexitне установлено, bashто потомки не будут SIGHUPdup bashпри выходе / выходе из системы;
Таким образом, в общем случае выход / выход из интерактивного 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 -9on на родительском методе методом nohupon на дочернем; вместо этого должно быть наоборот.
Убийство родителя с помощью kill -9метода не оставляет шанса для изящного выхода из родительского процесса, в то время как запуск дочернего элемента с помощью nohupметода позволяет завершить родительский процесс другими сигналами, такими как SIGHUP (чтобы создать пример, который имеет смысл в контексте ребенка начали использовать nohup), которые позволяют ему грациозно выйти.
&переведет процесс в фоновый режим (например, демон) и продолжит работу, даже если вы вышли из системы.