Jak rozwidlić proces, który nie umiera po wyjściu z powłoki?

31

Jeśli uruchomię emacsa z powłoki:

$ emacs foo &

a następnie zabić tę skorupę, emacs umiera.

Jak uruchomić polecenie, aby nie umarło po śmierci skorupy?

Znalazłem odniesienia do nohup, ale to nie wydaje się pomóc:

$ nohup emacs foo &

wciąż zabija emacsa, gdy skorupa umiera.

Sligocki
źródło

Odpowiedzi:

13

Nie wspominasz, czy działa jako aplikacja X czy konsola.

Jeśli jest to aplikacja konsolowa, oczywiście musi zostać zamknięta. Pozbyłeś się jego wejścia / wyjścia, a bardziej technicznie (pseudo) tty, na którym był włączony. Bardzo mało prawdopodobne jest to, co miałeś na myśli, więc załóżmy, że mówisz o aplikacji X.

nohuppowinien działać, nie jestem pewien, dlaczego tak nie jest. Gdy powłoka zostanie zamknięta, wysyła ją SIGHUPdo wszystkich procesów w swojej grupie procesów. nohup nakazuje zignorować SIGHUP.

Możesz także wypróbować setsid, który odłączy proces od grupy procesów

alias emacs='setsid emacs'

Lub dodaj disownpo&

Rich Homolka
źródło
Ach, świetnie działa Setid. Przepraszamy za brak jasności. Tak, mam na myśli aplikacje X, które tak naprawdę nie działają w powłoce. Zasadniczo chcę uruchomić emacsa (lub jakikolwiek inny proces) z powłoki, ale nie chcę, aby był w jakikolwiek sposób powiązany z powłoką. Właśnie zaczynam to dla wygody.
sligocki
41

Najbardziej niezawodną metodą wydaje się być:

(setsid emacs &)

Służy to ( &)do przechodzenia do tła i setsidodłączania się od kontrolującego tty.

Możesz umieścić to w funkcji powłoki:

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

fork emacs

Możliwości są następujące:

  • disownWbudowanego polecenia:

    emacs &
    disown $!
    

    &działa jako separator poleceń i disowndomyślnie przyjmuje ostatnie zadanie, więc można je skrócić do:

    emacs & disown
    
  • Double- fork():

    (emacs &)
    

    Polecenia w nawiasach ( )są uruchamiane w osobnym procesie powłoki.

  • setsid, zgodnie z sugestią Richa, może być najlepszym wyborem, ponieważ resetuje kontrolującą TTY procesu, tworząc nową sesję :

    setsid emacs
    

    Jest to jednak trochę nieprzewidywalne - będzie działało tylko fork()w tle, jeśli będzie liderem grupy procesów (co nie stanie się, jeśli setsidzostanie użyte shna przykład w skrypcie; w takich przypadkach będzie jedynie odporne na Ctrl- DO.)

grawitacja
źródło
Świetny! to wszystko działa dla mnie. Miło mieć więcej narzędzi w moim arsenale.
sligocki
Hm ... (exec emacs)działałoby?
Cześć71,
@Hello: Nie byłoby inaczej niż po prostu (emacs). Jeśli podpowłoka otrzyma jedno polecenie, execimplikowane jest to, przynajmniej w przypadku bash. To samo dotyczy bash -c 'foo'versus bash -c 'exec foo'. (Jednakże należy zauważyć, że Emacs sama może być oderwanie od terminala,.. Gvim, na przykład, czy to jest lepiej testu z programu z znany zachowania)
grawity
Świetnie się uczy techniki podwójnego widelca; dzięki!
Dave Abrahams,
Znalazłem to podczas trollowania, aby naprawić własny problem. (Emits SetSid &) działał dla mnie. Dziękuję za dobrze napisaną odpowiedź.
Paulb
5

Sprawdź ustawienia powłoki. Możesz także wypróbować screen zamiast nohup.

Josh K.
źródło
Ekran umożliwia powrót do procesu później, screen -rjeśli użyjesz go Ctrl-A Ctrl-Ddo odłączenia przed wylogowaniem.
Broam
To bardzo dobry punkt. Potrzebowałem czegoś przeciwnego, tj. Rozwidlenia podpowłoki i kontynuowania innych zadań bez czekania na ich zakończenie, ale screen -d -m sh -c "{do stuff } exit"ma to o wiele większy sens.
Nemo,