Piszę skrypt powłoki , który chciałbym uruchamiać jako demon podczas uruchamiania bez użycia zewnętrznych narzędzi, takich jak daemontools lub demonizuj .
Linux Daemon Writing HOWTO
Według HOWTO Daemon pisania , o właściwej demon ma następujące cechy:
- widelce z procesu nadrzędnego
- zamyka wszystkie deskryptory plików (czyli
stdin
,stdout
,stderr
) - otwiera dzienniki do zapisu (jeśli skonfigurowano)
- zmienia katalog roboczy na trwały (zwykle
/
) - resetuje maskę trybu pliku (umask)
- tworzy unikalny identyfikator sesji (SID)
demonizuj Wprowadzenie
Daemonize Wprowadzenie idzie dalej, stwierdzając, że to typowy demon również:
- odłącza się od terminala sterującego (jeśli taki istnieje) i ignoruje wszystkie sygnały terminala
- odłącza się od swojej grupy procesów
- uchwyty
SIGCLD
Jak bym to wszystko zrobić w sposób sh
, dash
lub bash
skrypt tylko wspólnych narzędzi Linux?
Skrypt powinien być w stanie działać na możliwie największej liczbie dystrybucji bez dodatkowego oprogramowania, chociaż naszym głównym celem jest Debian .
UWAGA: Wiem, że w sieci StackExchange jest wiele odpowiedzi zalecających użycie nohup
lub setsid
, ale żadna z tych metod nie spełnia wszystkich powyższych wymagań.
EDYCJA: Strona podręcznika demona (7) również daje pewne wskazówki, chociaż wydaje się, że istnieją pewne różnice między SysV
demonami w starszym stylu i nowszymi systemd
. Ponieważ ważna jest zgodność z różnymi dystrybucjami, upewnij się, że odpowiedź wyjaśnia wszelkie różnice.
źródło
daemon
te i inne służą do uruchamiania dowolnych skryptów powłoki bez możliwości działania jako demon. Ponieważ jesteś autorem i masz pełną kontrolę nad sposobem pisania tego skryptu, spraw, aby można go było uruchomić ze skryptu systemfile lub skryptu rc.d. Państwo było określić „Właściwa”!Odpowiedzi:
Używając systemd powinieneś być w stanie uruchomić skrypt jako demon, tworząc prostą jednostkę. Istnieje wiele różnych opcji, które można dodać, ale jest to tak proste, jak to tylko możliwe.
Powiedz, że masz skrypt
/usr/bin/mydaemon
.Tworzysz jednostkę
/etc/systemd/system/mydaemon.service
.Aby uruchomić demona, biegniesz
Aby rozpocząć przy rozruchu, włącz go
Jeśli w systemie opartym na systemie, którym jest większość dystrybucji Linuksa, to tak naprawdę nie jest to narzędzie zewnętrzne. Negatywne byłoby to, że nie wszędzie to zadziała.
źródło
systemd
nie jest bardziej „narzędziem zewnętrznym” niżbash
.Prawdopodobnie coś mi tu brakuje; dlaczego dokładnie nie
nohup
byłoby właściwe? Oczywiście nie wystarczy sam , ale uzupełnienie wydaje się proste.O ile widzę:
stdin
umiera jednak na końcu skryptu nadrzędnegoinit
(lubsystemd
)Mam silne przeczucie, że tęsknię za oczywistością. Głosuj, ale powiedz mi, co to jest :-)
źródło
nohup
z&
przekierowaniem I / O, aby uruchomić kilkaC
narzędzi nie będących demonami, być może z dodatkowym zabezpieczeniem polegającym na owijaniunohup
polecenia wewnątrz a,su -c "nohup ... &" -s /bin/bash systemUser
aby uruchomić demona jako użytkownik nieuprzywilejowany.Polecenie Linux
screen
zawarte w większości dystrybucji może demonizować skrypt powłoki. Często go używam. Oto szybki przykład, aby rozpocząć, wyświetlić listę i zakończyć sesję z odłączonym ekranem ...źródło
screen
nie demonizuje skryptu powłoki. Po prostu działają w wyróżniającym się terminalu i mogą odłączyć się od tego terminala (np. Odłączyć klawiaturę od komputera) bez zamykania sesji. Tak więc program działający w odłączonym terminalu działa w tle. Dlatego - odłącz program pass w tle.