GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu forkovat proces, který nezemře, když shell opustí?

Nejspolehlivější metodou se zdá být:

(setsid emacs &)

Toto používá ( &) k rozvětvení na pozadí a setsid k odpojení od ovládacího tty.

Můžete to vložit do funkce shellu:

fork() { (setsid "[email protected]" &); }

fork emacs

Možnosti jsou:

  • disown vestavěný příkaz:

    emacs &
    disown $!
    

    & funguje jako oddělovač příkazů a disown bude výchozí na nejnovější úlohu, takže to lze zkrátit na:

    emacs & disown
    
  • Double-fork() :

    (emacs &)
    

    Příkazy v závorkách ( ) jsou spuštěny v samostatném procesu shellu.

  • setsid , jak navrhuje Rich, může být tou nejlepší volbou, protože zruší nastavení řídicího TTY procesu vytvořením nové relace:

    setsid emacs
    

    Je to však také trochu nepředvídatelné - bude to pouze fork() na pozadí, pokud je vedoucím skupiny procesů (což se nestane, pokud setsid se používá v sh skript, například; v takových případech se pouze stane odolným vůči Ctrl-C.)


Neuvádíte, zda to běží jako X aplikace nebo konzolová aplikace.

Pokud je to jako konzolová aplikace, musí se samozřejmě zavřít. Zbavili jste se jeho vstupu/výstupu, technickyji řečeno (pseudo)tty, na kterém byl zapnutý. Je velmi nepravděpodobné, že jste to mysleli, takže předpokládejme, že mluvíte o aplikaci X.

nohup by mělo fungovat, nevím proč ne. Když se shell zavře, odešle SIGHUP všem procesům ve své skupině procesů. nohup říká příkazu, aby ignoroval SIGHUP.

Můžete také zkusit setsid, které odpojí proces od skupiny procesů

alias emacs='setsid emacs'

Nebo přidejte disown po &


Zkontrolujte nastavení shellu. Místo nohup můžete také zkusit screen .


Linux
  1. [Linux] :Jak vyloučit adresář při použití příkazu shellu „tar“.

  2. Jak spustit Node.js jako proces na pozadí a nikdy nezemřít?

  3. Kdy je setsid() užitečné nebo proč potřebujeme seskupovat procesy v Linuxu?

  1. Jak získat výstupní kód vytvořeného procesu ve skriptu očekávaného shellu?

  2. Existuje nějaká oprava distribuce Linuxu nebo jádra, která po ukončení procesu vymaže prostor v paměti procesu?

  3. Jak zakázat vypnutí, aby nemohl být přerušen důležitý proces?

  1. Jak získat upozornění, když Svcadm restartuje službu, která zemřela?

  2. Linux – Jak zjistím, kdy byl proces spuštěn?

  3. Jak spustím druhý shell v režimu jednoho uživatele?