Cos'è un processo interrotto in Linux?


12

Quindi avevo alcuni script PHP in esecuzione dalla riga di comando e volevo fermarli.

ho corso

$ ps aux | grep php
$ sudo kill 8754
$ sudo kill 8767

E poi corse

$ ps aux | grep php

ancora una volta per verificare che i processi fossero terminati, ma ottenuto questo tipo di output:

jon      8754  0.4 53.5 3044256 2205204 ?     T    10:34   0:15 php awesome_script.php
jon      8767  0.4 53.5 3044256 2205204 ?     T    10:34   0:15 php awesome_script.php
jon     12275  0.0  0.0   4156   892 pts/1    S+   11:27   0:00 grep --color=auto php

Ho cercato cosa significasse la T nella colonna di stato e ho scoperto che significa Stopped, ma non capisco cosa significhi che il processo sta facendo.

So che puoi creare la tua gestione del segnale in PHP, ma non l'ho fatto, quindi quando PHP riceve un segnale SIGTERM che cosa fa?

Cosa sta facendo un processo interrotto (se non altro)?

Risposte:


15

Significa che il processo ha ricevuto un STOPsegnale e non farà nulla fino a quando non riceverà un CONTsegnale, nemmeno terminerà.

La fonte più comune di STOPsegnali è l'utente che colpisce ^zmentre il processo è in primo piano e il modo comune per inviare un CONTsuccessivo è la digitazione fgo bgche continuano il processo rispettivamente in primo piano e in background.

Un altro modo per inviare STOPa un processo è kill -STOP $pid. Allo stesso modo, CONTpuò essere inviato a un processo con kill -CONT $pid.

Dato che hai inviato TERMsegnali ai processi, presumo che tu li voglia terminare. Perché ciò avvenga, i processi devono ricevere CONTsegnali. Puoi inviarli digitando kill -CONT 8754 8767una finestra del terminale.


L'invio di un segnale CONT consentirebbe l'esecuzione dello script fino al completamento? O causerebbe la chiusura immediata dello script?
Jon

Il processo continua quello che stava facendo (prima di STOP) alla ricezione di un CONT. Se hai inviato un TERM ( kill $pidad esempio) mentre è stato interrotto, tuttavia, risponderà (in ritardo) a quel TERM e terminerà.
Eroen,

Hmm, quindi ho inviato un TERM eseguendo kill 8754che dovrebbe causare la fine del processo giusto? Sai in quale stato si troverebbe un processo mentre sta per terminare? Dato che il processo è entrato nello stato STOP, come se avesse ricevuto un segnale STOP kill -STOP 8754, potrebbe succedere anche se fosse stato inviato un segnale TERM?
Jon

Un processo interrotto non termina a causa di un TERMsegnale fino a quando non viene continuato. Terminerà immediatamente se riceve un KILLsegnale, anche quando è fermo. Presumo che un processo sarà nello stato Run quando termina. Non conosco molto bene PHP e non so come spiegare perché un processo si è fermato, scusa. Generalmente, tuttavia, i processi non si fermano ma terminano quando ricevono TERM.
Eroen,

4

Il processo arrestato in Linux / Unix è un processo / task che ha ricevuto il segnale di sospensione ( SIGSTOP/ SIGTSTP) che dice al kernel di non eseguire alcun processo su di esso poiché è stato arrestato e può riprendere la sua esecuzione solo se viene inviato il SIGCONTsegnale.

Il processo sostanzialmente arrestato attende un segnale di continuazione dal kernel, così come il processo sospeso attende una condizione di riattivazione dal kernel.

Stati del processo del kernel Linux: Pronto, In esecuzione, Interrotto, Sospeso, Tracciato, Zombi

Crediti immagine: polytechnique.fr


Ogni processo nel kernel Linux è rappresentato da una task_structstruttura di dati e ogni taskvettore è costituito da una serie di puntatori a ciascuno task_struct. che descrive un processo o un'attività nel sistema (sia che sia unrunnable, runnableo stopped). Vedere: Processi e Strutture dati Linux ) per maggiori dettagli.

Vedi anche: Il kernel Linux: Gestione dei processi


@Jus Grazie per la segnalazione, l'ho corretto.
Kenorb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.