GNU/Linux >> Linux Esercitazione >  >> Linux

I file .pid sono affidabili per determinare se un processo è in esecuzione?

Soluzione 1:

in termini semplici, no :un processo (ad esempio un demone) può bloccarsi e non avere il tempo di cancellare il suo file .pid.

Una tecnica per essere più certi dello stato di un programma:utilizzare un canale di comunicazione esplicito come un socket. Scrivi la porta del socket in un file e ottieni il supervisor processo cercalo.

Puoi anche utilizzare i servizi di DBus su Linux:registra un nome specifico e chiedi al tuo processo supervisore (come lo chiami tu) di controllare quel nome.

Esistono numerose tecniche.

Una cosa da ricordare:non è responsabilità del sistema operativo gestire i file PID.

Soluzione 2:

Jldupont ha ragione nell'affermare che i file .pid non sono affidabili per determinare se un processo è in esecuzione poiché il file potrebbe non essere rimosso in caso di arresto anomalo.

Condizioni di gara a parte, uso spesso pgrep quando ho bisogno di sapere se un processo è in esecuzione. Potrei quindi incrociare l'output con i file .pid se lo ritenessi necessario.

Soluzione 3:

Un file contenente un ID di processo non è affidabile per determinare se un processo è in esecuzione o meno. È solo una fonte affidabile, per capire l'ultimo ID di processo dato per il processo.

Quando hai l'id del processo, devi fare ulteriori controlli, se il processo è realmente in esecuzione.

Ecco un esempio:

#!/usr/bin/env sh

file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)

if [ ! -f ${file} ]; then
    echo "File does not exists: ${file}"
    exit 1
fi

if [ ! -r ${file} ]; then
    echo "Insufficient file persmissons: ${file}"
    exit 1
fi

psoutput=$(ps -p ${processid} -o comm=)

if [ $? == 0 ];then
    if [ ${psoutput} == "sshd" ]; then
        echo "sshd process is realy running with process id ${processid}"
        exit 0
    else
        echo "given process id ${processid} is not sshd: ${psoutput}"
        exit 1
    fi
else
    echo "there is no process runing with process id ${processid}"
    exit 0
fi

pgrep è un bel comando, ma ti troverai nei guai quando hai più istanze in esecuzione. Ad esempio, quando hai un normale sshd in esecuzione sulla porta TCP/22 e hai un altro sshd in esecuzione sulla porta TCP/2222, allora pgrep fornirà due ID di processo durante la ricerca di sshd ... quando il normale sshd ha il suo pid in /var/run/sshd.pid e l'altro potrebbe avere il suo pid in /var/run/sshd-other.pid puoi differenziare chiaramente i processi.

Non consiglia di utilizzare solo ps , reindirizzando attraverso una o più pipe con grep e grep -v cercare di filtrare tutte le altre cose che non ti interessano... è un po' come usare

find . | grep myfile

per capire se un file esiste.

Soluzione 4:

Non è affidabile controllare semplicemente l'esistenza di un processo con lo stesso pid contenuto nel file.

Ma molte implementazioni di pidfile eseguono anche il blocco sul pidfile, in modo che se il processo muore, il blocco scompare. A condizione che il meccanismo di blocco sia affidabile, verificare se il file è ancora bloccato è un meccanismo relativamente affidabile per determinare se il processo originale è ancora in esecuzione.


Linux
  1. Pseudo file per dati temporanei?

  2. Quale processo ha Pid 0?

  3. Numero massimo di file aperti per il processo di lavoro

  4. Come verificare quali librerie condivise vengono caricate in fase di esecuzione per un determinato processo?

  5. Perché i file .so sono eseguibili?

Come impostare l'ID processo in Linux per un programma specifico

Conteggio dei file aperti per processo

Qual è il PID nell'host, di un processo in esecuzione all'interno di un contenitore Docker?

Come posso creare un file dump di un processo in esecuzione in Linux?

Determinazione del particolare processore su cui è in esecuzione un processo

Variabili d'ambiente di un processo in esecuzione su Unix?