Як розблокувати процес, який не вмирає при виході оболонки?


31

Якщо я запускаю emacs з оболонки:

$ emacs foo &

а потім вбивають цю оболонку, Emacs гине.

Як я можу запустити команду, щоб вона не загинула, коли оболонка відмирає?

Я знайшов посилання на nohup, але це, здається, не допомагає:

$ nohup emacs foo &

все ще вбиває emacs, коли шкаралупа гине.

Відповіді:


13

Ви не згадуєте, чи це працює як додаток X або консольний додаток.

Якщо це як консольний додаток, звичайно, його потрібно закрити. Ви позбулися його вводу / виводу, технічніше (псевдо), на якому він був. Це малоймовірно, що це ви мали на увазі, тому припустимо, ви говорите про додаток X.

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

Ви також можете спробувати setid, який відключає процес від групи процесів

alias emacs='setsid emacs'

Або додайте disownпісля&


Ах, чудові сетіс твори. Вибачте, що не зрозуміли. Так, я маю на увазі програми X, які насправді не працюють у оболонці. В основному я хочу запустити emacs (або будь-який інший процес) з оболонки, але я не хочу, щоб він жодним чином прив’язувався до оболонки. Я тільки починаю його там для зручності.
sligocki

41

Найбільш надійним методом є:

(setsid emacs &)

Для цього використовується ( &)роздвоєння до фону та setsidвід'єднання від керуючого tty.

Ви можете помістити це в функцію оболонки:

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

fork emacs

Можливості:

  • disownКоманда вбудована:

    emacs &
    disown $!
    

    &діє як роздільник команд і disownза замовчуванням виконує останню роботу, тому це може бути скорочено до:

    emacs & disown
    
  • Подвійний fork():

    (emacs &)
    

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

  • setsid, як запропонував Річ, може бути найкращим вибором, оскільки він скасовує керуючу TTY процесу шляхом створення нового сеансу :

    setsid emacs
    

    Однак це також є трохи непередбачуваним - це буде лише fork()на тлі, якщо він є лідером групи процесів (що не відбудеться, якщо setsid, наприклад, використовується в shсценарії; в таких випадках він просто стане стійким до Ctrl- C.)


Чудово! все це для мене працює. Приємно мати в своєму арсеналі ще кілька інструментів.
sligocki

Гм ... (exec emacs)працював би ?
Привіт71

@Hello: Це нічим не відрізнятиметься від справедливого (emacs). Якщо підпакеті надається одна команда, то execмається на увазі, принаймні у випадку bash. Те саме стосується і bash -c 'foo'проти bash -c 'exec foo'. (Однак зауважте, що сам emacs може відриватися від терміналу; наприклад, gvim це робить. Краще протестувати з програмою з відомою поведінкою.)
grawity

Чудово освоїти техніку подвійної вилки; Спасибі!
Дейв Абрахамс

Знайшов це під час тролінгу, щоб вирішити свою проблему. На мене працювали (setid emacs &). Дякую за добре написану відповідь.
Павло

5

Перевірте налаштування оболонки. Ви можете також спробувати екран замість nohup.


Екран дозволяє вам повернутися до процесу пізніше, screen -rякщо ви Ctrl-A Ctrl-Dвідключите його перед виходом із системи.
Брам

Це дуже хороший момент. Мені потрібно було навпаки, тобто розпакувати нижню оболонку і приступити до інших завдань, не чекаючи її завершення, але screen -d -m sh -c "{do stuff } exit"має набагато більше сенсу.
Немо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.