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


11

Molti programmi come sshd creano file .pid in / var / run / che contengono il loro ID di processo. Questi file sono affidabili per determinare se un processo è in esecuzione? La mia ipotesi è che questi file vengano creati manualmente da un processo e quindi rimarranno nel file system in caso di arresto anomalo del programma.

Risposte:


16

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

Una tecnica per essere più sicuri dello stato di un programma: utilizzare un canale di comunicazione esplicito come un socket. Scrivi la porta del socket in un file e fai in modo che il supervisorprocesso lo cerchi.

Puoi anche usare i servizi di DBus su Linux: registra un nome specifico e fai controllare il tuo processo da supervisore (come lo chiami).

Esistono numerose tecniche.

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


1
L'esistenza del file pid, COMBINATA con l'esistenza del processo, tuttavia, dovrebbe essere sufficiente. Se il processo termina, puoi verificarlo. I PID vengono riutilizzati, ma non molto spesso.
MarkR

2
la frequenza con cui un pid viene riutilizzato dipende dal particolare sistema in questione. Ho visto un sistema in cui i PID venivano ciclicati almeno ogni giorno. Devi controllare il pid, che c'è un processo e che il processo sembra essere quello che ti aspetti di possedere il pid.

@atk: esattamente. Non esiste uno standard di per sé e anche se ce n'era uno, può benissimo non essere rispettato da alcune implementazioni. Ad esempio, posso creare un demone che non scrive affatto un file PID e utilizzare un canale posteriore per ottenere i suoi comandi di gestione.
jldupont,

@atk: sfortunatamente, non c'è modo di garantire che il PID non venga riutilizzato tra l'ora del controllo e l'ora dell'uso ...
SamB

3

Jldupont ha ragione nel dichiarare che i file .pid non sono affidabili per determinare se un processo è in esecuzione poiché il file potrebbe non essere rimosso in caso di crash.

A parte le condizioni di gara, uso spesso pgrep quando devo sapere se un processo è in esecuzione. Potrei quindi fare un riferimento incrociato all'output rispetto ai file .pid se lo ritengo necessario.


3

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

Quando si dispone dell'ID processo, è necessario eseguire 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 metterai 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, pgrep fornirà due id di processo durante la ricerca di sshd ... quando lo sshd normale ha il suo pid in / var /run/sshd.pid e l'altro potrebbe avere il suo pid in /var/run/sshd-other.pid è possibile differenziare chiaramente i processi.

Io non consiglio di usare solo ps , tubazioni attraverso uno o più pipe con grep e grep -v cercando di filtrare tutte le altre cose che non ti interessa ... è un po 'come l'utilizzo di

find . | grep myfile

per capire se esce un file.


2

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

Ma molte implementazioni di pidfile bloccano anche il pidfile, in modo che se il processo si interrompe, 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.


1

Jldupont ha ragione.

Puoi, tuttavia, inviare al processo un segnale 0 (kill -s 0 pid) per vedere se il processo è ancora attivo (supponendo che tu abbia l'autorità per inviare tale segnale - in generale, solo il proprietario di un processo può inviare è un segnale).


4
Ma verificare l'esistenza di un processo con quel PID non significa che è il PID che ti interessa.
JANM

0

Sono d'accordo con jschmier.

Su alcuni sistemi, non si ottiene l'accesso a pgrep. In tal caso, puoi fare ps -aef | grep <pid>per scoprire se il processo è davvero in esecuzione.


1
Il punto chiave nella domanda era "affidabile". Fare un ps e cercare un PID non è affidabile.
JANM

beh ... supponendo che tu conosca quel nome del programma, perché pensi che ps -aef | grep non è affidabile?
user29584

3
Condizioni di gara: lo stato del sistema è cambiato quando ps è terminata. Titoli di processo: un altro processo potrebbe avere un titolo simile a quello a cui sei interessato. Istanze multiple: considera un sistema con due istanze dello stesso servizio, ognuna con un file PID. Uno fallisce e l'altro si riavvia e ottiene il PID del primo servizio. Come si dice Ecc. Non affidabile, impossibile da ottenere a causa delle condizioni di gara, e ci sono tecniche affidabili che funzionano. Per un'alternativa affidabile vedere, ad esempio, cr.yp.to/daemontools.html
gennaio
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.