GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo systemd gestisce la morte di un figlio di un processo gestito?

No.

Il processo principale gestisce la morte dei suoi figli, in modo normale.

Questo è il mondo POSIX. Se il processo A ha biforcato B e il processo B ha biforcato C, D ed E; quindi il processo B è ciò che vede SIGCHLD e wait() stato dalla cessazione di C, D ed E. Il processo A non è a conoscenza di ciò che accade a C, D ed E, e questo è indipendente da systemd.

Affinché A sia consapevole della chiusura di C, D ed E, devono accadere due cose.

  • A deve registrarsi come "subreaper". systemd lo fa, così come vari altri gestori di servizi inclusi upstart e nosh service-manager .
  • B deve exit() . I servizi che stupidamente, erroneamente e invano cercano di "dæmonizzare" se stessi fanno questo.

(Si può diventare furbi con kevent() sui BSD. Ma questa è una domanda su Linux.)


systemd ha il concetto di processo principale. Nella documentazione di systemd questo è indicato come "processo di servizio principale" o semplicemente "processo principale".

L'esempio 4 nella documentazione di systemd.service descrive come il processo principale viene calcolato quando Type=forking .

La documentazione per Restart= nei documenti systemd.service descrivono le diverse possibilità per quando un servizio viene avviato in relazione al processo principale.

Ecco il testo chiave dell'"esempio 4" collegato sopra:

systemd considererà il servizio in fase di inizializzazione mentre il programma originale è ancora in esecuzione. Una volta che itesce con successo e rimane almeno un processo (andRemainAfterExit=no), il servizio è considerato avviato.

Spesso, un demone tradizionale è costituito da un solo processo. Pertanto, se rimane un solo processo dopo il termine del processo originale, systemd considererà tale processo il processo principale del servizio. In tal caso, la variabile $MAINPID sarà disponibile in ExecReload=,ExecStop=, ecc.

Nel caso in cui rimanga più di un processo, systemd non sarà in grado di determinare il processo principale, quindi non presumerà che ce ne sia uno. In tal caso, $MAINPID non si espanderà in nulla. Tuttavia, se il processo decide di scrivere un file PID tradizionale, systemd sarà in grado di leggere il PID principale da lì. Si prega di impostare PIDFile=di conseguenza.


Linux
  1. Come funziona il bit appiccicoso?

  2. Cosa significa nell'output di Ps?

  3. Come funziona il processo di aggiornamento di Ubuntu?

  4. Come trovare tutti i processi figlio?

  5. Come ottenere l'ID del processo per terminare un processo nohup?

Come modificare la priorità di un processo in Linux

Come inviare processi in background su Linux

Come funziona internamente copy_from_user dal kernel di Linux?

Come ottenere il processo figlio dal processo padre

Come funziona il comando ps?

Come fa la CPU a sapere quale indirizzo fisico è mappato a quale indirizzo virtuale?