29

Если я запускаю emacs из оболочки:

$ emacs foo &

и затем убить эту оболочку, Emacs умирает.

Как я могу выполнить команду, чтобы она не умерла при смерти оболочки?

Я нашел ссылки на nohup, но это, похоже, не помогает:

$ nohup emacs foo &

все еще убивает Emacs, когда оболочка умирает.

3 ответа3

37

Наиболее надежным методом является:

(setsid emacs &)

Он использует ( &) для разветвления на задний план и setsid для отсоединения от управляющего tty.

Вы можете поместить это в функцию оболочки:

fork() { (setsid "$@" &); }

fork emacs

Возможности:

  • Встроенная команда disown:

    emacs &
    disown $!
    

    & действует как разделитель команд, а disown умолчанию будет соответствовать самой последней работе, поэтому ее можно сократить до:

    emacs & disown
    
  • Двойная fork():

    (emacs &)
    

    Команды внутри скобок ( ) запускаются в отдельном процессе оболочки.

  • setsid , как предложил Rich, может быть лучшим выбором, потому что он отменяет управляющий TTY процесса, создавая новый сеанс:

    setsid emacs
    

    Тем не менее, это также немного непредсказуемо - он будет выполнять только fork() в фоновом режиме, если он является лидером группы процессов (что не произойдет, если в сценарии setsid , например, sh ; стать устойчивым к Ctrl-C.)

13

Вы не упоминаете, работает ли это как приложение X или консольное приложение.

Если это как консольное приложение, конечно, его нужно закрыть. Вы избавились от его ввода / вывода, более технически (псевдо) tty он был включен. Маловероятно, что вы это имели в виду, поэтому давайте предположим, что вы говорите о приложении X.

nohup должен работать, не уверен, почему это не так. Когда оболочка закрывается, она отправляет SIGHUP всем процессам в своей группе процессов. nohup говорит команде игнорировать SIGHUP.

Вы также можете попробовать setsid, который отключает процесс от группы процессов

alias emacs='setsid emacs'

Или добавьте disown после &

5

Проверьте настройки оболочки. Вы также можете попробовать экран вместо nohup .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .