Как мне развить процесс, который не умирает при выходе из оболочки?
Если я запускаю emacs из оболочки:
$ emacs foo &
а затем убить эту оболочку, Emacs умирает.
Как я могу выполнить команду, чтобы она не умерла при смерти оболочки?
Я нашел ссылки на nohup, но это, похоже, не помогает:
$ nohup emacs foo &
все еще убивает Emacs, когда оболочка умирает.
3 ответа
Вы не упоминаете, работает ли это как приложение X или консольное приложение.
Если это как консольное приложение, конечно, его нужно закрыть. Вы избавились от его ввода / вывода, более технически (псевдо) tty он был включен. Маловероятно, что вы это имели в виду, поэтому давайте предположим, что вы говорите о приложении X.
nohup
должно работать, не уверен, почему это не так. Когда оболочка закрывается, она отправляет SIGHUP
ко всем процессам в своей группе процессов. nohup говорит команде игнорировать SIGHUP.
Вы также можете попробовать setsid, который отключает процесс от группы процессов
alias emacs='setsid emacs'
Или добавить disown
после &
Наиболее надежным методом является:
(setsid emacs &)
Это использует ( &)
раскошелиться на задний план, и setsid
оторваться от контролирующего тты.
Вы можете поместить это в функцию оболочки:
fork() { (setsid "$@" &); }
fork emacs
Возможности:
disown
встроенная команда:emacs & disown $!
&
действует как разделитель команд, иdisown
по умолчанию будет самой последней работой, поэтому ее можно сократить до:emacs & disown
Двойной
fork()
:(emacs &)
Команды внутри скобок
(
)
запускаются в отдельном процессе оболочки.setsid
как предложил Rich, может быть лучшим выбором, потому что он отменяет управляющий TTY процесса, создавая новый сеанс:setsid emacs
Тем не менее, это также немного непредсказуемо - это будет только
fork()
в фоновом режиме, если он является лидером группы процессов (что не произойдет, еслиsetsid
используется вsh
сценарий, например; в таких случаях он просто станет устойчивым к Ctrl-C.)
Проверьте настройки оболочки. Вы также можете попробовать экран вместо nohup
,