Jakie są praktyczne różnice z punktu widzenia sysadmin podczas wdrażania usług w systemie uniksowym?
Jakie są praktyczne różnice z punktu widzenia sysadmin podczas wdrażania usług w systemie uniksowym?
Odpowiedzi:
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.
&
wyjaśnienie części do swojej odpowiedzi. Wydaje się, że jest niekompletny ... jeśli sprawdzisz oryginalne pytanie.
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
) ...
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ć.
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 HUP
sygnał 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.out
lub2>errors.out
W większości systemów możesz mieć dostęp do nohup
polecenia.
nohup
znacznie 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.out
zostają przekierowane, IIRC, do , ale tę nazwę pliku można zmienić za pomocą opcji.
command &
później od powłoki, z disown
którą następnie działa jako post-nohup.