Jaka jest różnica między uruchomieniem programu jako demona i przeniesieniem go w tło za pomocą „&”?

Odpowiedzi:

31

Tradycyjny sposób demonizacji to:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

To gwarantuje, że proces nie będzie już w tej samej grupie procesów co terminal, a zatem nie zostanie zabity razem z nim. Przekierowanie IO ma sprawić, że wyjście nie pojawi się na terminalu.

Dennis Kaarsemaker
źródło
5
więc jeśli terminal odradzający proces w tle (&) zostanie zamknięty, proces w tle również się zakończy?
user1561108,
9
Proces odbierze SIGHUP po wyjściu terminala, domyślnym modułem obsługi tego sygnału jest zakończenie procesu.
Dennis Kaarsemaker
12
Dodaj &wyjaśnienie części do swojej odpowiedzi. Wydaje się, że jest niekompletny ... jeśli sprawdzisz oryginalne pytanie.
mtk
1
To dlatego, że uruchamianie rzeczy w tle za pomocą & nie sprawia, że ​​proces robi coś specjalnego :)
Dennis Kaarsemaker
33

Dla demona potrzebujesz procesu, który nie ma z niczym powiązania. Przynajmniej chcesz, aby był w swojej własnej sesji, nie był dołączony do terminala, nie miał odziedziczonego deskryptora pliku nadrzędnego, nie miał nadrzędnego opiekującego się tobą (innego niż init) katalog, /aby nie zapobiec umount ...

Aby odłączyć się od terminala, tworzysz nową sesję, jednak aby utworzyć sesję, nie możesz być liderem grupy (lub sesji), więc najlepiej jest rozwidlić nowy proces. Zakładając, że rodzic wyjdzie, oznacza to również, że proces nie będzie już miał rodzica i zostanie przyjęty przez init. Następnie zamknij wszystkie możliwe deskryptory plików, ty chdir("/")(nie można zamknąć bieżącego katalogu roboczego, aby zwolnić ten zasób, tak jak w przypadku deskryptorów plików, co sprawia, /że bieżące katalogi robocze przynajmniej nie zapobiegają odmontowaniu katalogów).

Ponieważ ten proces jest liderem sesji, istnieje ryzyko, że jeśli kiedykolwiek otworzy urządzenie końcowe, stanie się procesem kontrolnym tego terminala. Widelec po raz drugi gwarantuje, że tak się nie stanie.

Z drugiej strony, &, w interaktywnych powłokach, rozwidla i tworzy nową grupę procesów (aby nie być w grupie procesów pierwszego planu terminala), aw nieinteraktywnych powłokach, rozwidla proces i ignoruje w nim SIGINT. Nie odłącza się od terminala, nie zamyka deskryptorów plików (choć niektóre powłoki ponownie otworzą standardowe wejście /dev/null) ...

Stéphane Chazelas
źródło
do czego służy chdir („/”)? zamknąć deskryptor pliku?
Timothy Leung
@TimothyLeung, patrz edycja.
Stéphane Chazelas
8

Różnica między uruchomieniem programu / procesu jako demona a przekazaniem go do tła za pomocą znaku handlowego jest zasadniczo związana z własnością.

Najczęściej proces nadrzędny demona jest procesem inicjującym (pierwszy proces uruchamiany w systemie uniksowym), ponieważ demon będący dzieckiem tego procesu oznacza, że ​​nie jest on pod twoją bezpośrednią kontrolą jako użytkownik nieuprzywilejowany . Z drugiej strony rozwidlenie programu / procesu w tle oznacza, że ​​możesz w dowolnym momencie przywołać go z powrotem na pierwszy plan i / lub zabić.

Odaym
źródło
1
Aby odpowiedzieć na powyższą techniczną stronę odłączania procesu w porównaniu z utrzymywaniem go jako potomka terminala, możesz spróbować uruchomić „nohup firefox &”
Odaym,
7

Z command &Twój proces zostanie zabity przez sygnał SIGHUP, gdy rodzic umiera.

Administratorzy systemów mają jednak dostęp do niektórych obejść.

W systemie bash możesz użyć:

(trap '' HUP; command) &

To otwiera podpowłokę, przechwytuje HUPsygnał z pustym modułem obsługi i ampersand / forks go.

Dane wyjściowe mogą nadal zostać przekierowane na niewłaściwy adres tty. Lub się zgubić.
Można ustalić, że z &>command.out, 1>output.outlub2>errors.out

W większości systemów możesz mieć dostęp do nohuppolecenia.
nohupznacznie upraszcza ten proces. Jest to dość standardowe, ale zauważyłem, że brakuje wielu wbudowanych dystrybucji ARM typu busybox. Po prostu piszesz:

nohup command &

..i jesteś skończony. Dane wyjściowe nohup.outzostają przekierowane, IIRC, do , ale tę nazwę pliku można zmienić za pomocą opcji.

ZJR
źródło
2
Wystarczy zauważyć, że z ZSH możesz odłączyć command &później od powłoki, z disownktórą następnie działa jako post-nohup.
matematyka