Как мне развить процесс, который не умирает при выходе из оболочки?

Если я запускаю 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,

Другие вопросы по тегам