Как мне развить процесс, который не умирает при выходе из оболочки?
Если я запускаю 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,