A cosa servono i file pid e lock?


75

Vedo spesso che i programmi specificano file pid e lock. E non sono del tutto sicuro di cosa facciano.

Ad esempio, durante la compilazione di nginx:

--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \

Qualcuno può far luce su questo?

Risposte:


86

i file pid sono scritti da alcuni programmi per registrare il loro ID di processo durante l'avvio. Questo ha molteplici scopi:

  • È un segnale per altri processi e utenti del sistema che quel particolare programma è in esecuzione, o almeno avviato correttamente.
  • Permette di scrivere uno script davvero facile da controllare se è in esecuzione ed emettere un semplice killcomando se si desidera terminarlo.
  • È un modo economico per un programma di vedere se una sua precedente istanza in esecuzione non è stata chiusa correttamente.

La semplice presenza di un file pid non garantisce che quel particolare ID processo sia in esecuzione, ovviamente, quindi questo metodo non è sicuro al 100% ma "abbastanza buono" in molti casi. Controllare se un particolare PID esiste nella tabella dei processi non è totalmente portatile tra i sistemi operativi simili a UNIX a meno che non si desideri dipendere psdall'utilità, che potrebbe non essere desiderabile chiamare in tutti i casi (e credo che alcuni sistemi operativi simili a UNIX implementare psdiversamente comunque).

I file di blocco vengono utilizzati dai programmi per garantire che due istanze separate (ben educate) di un programma, che possono essere in esecuzione contemporaneamente su un sistema, non accedano a qualcos'altro allo stesso tempo. L'idea è prima che il programma acceda alla sua risorsa, controlla la presenza di un file di blocco e, se il file di blocco esiste, si verifica un errore o attende che scompaia. Quando non esiste, il programma che desidera "acquisire" la risorsa crea il file e quindi altre istanze che potrebbero verificarsi in seguito attenderanno che questo processo venga completato. Naturalmente, ciò presuppone che il programma "acquisendo" il blocco lo rilasci effettivamente e non dimentichi di eliminare il file di blocco.

Questo funziona perché il filesystem con tutti i sistemi operativi simili a UNIX applica la serializzazione , il che significa che in realtà una sola modifica al filesystem avviene in un dato momento. Sorta di blocchi simili con database e simili.


1
Ciò è corretto, a meno che il file di blocco non venga eliminato manualmente. VMWare Player mostra questo comportamento, ad esempio, se VMWare Player si arresta in modo anomalo, devi eliminare un .lckfile nella directory della VM altrimenti ti dirà che è in uso quando tenti di avviarlo.
LawrenceC,

1
Che mi dici di Windows? Come gestisce i file .lock? Dopotutto, non è simile a Unix.
Sarahof Gaia,

2
Non credo sia comune che i programmi Windows funzionino in questo modo. Gli unici programmi con questo comportamento che ho visto sono le porte di Unix / Linux
HaMster,

2
LawrenceC, Re " Quando non esiste, il programma che vuole" acquisire "la risorsa crea il file "; Ma ci sono funzioni appropriate appositamente costruite per eseguire tale sincronizzazione. Perché non fare affidamento su queste funzioni invece di utilizzare il "file hack"?
Pacerier,

1
@Pacerier - I file di blocco in questo modo sono probabilmente usati più spesso da cose come gli script di shell o programmi che potrebbero interagire con gli script di shell, poiché le shell Unix / Linux interagiscono molto facilmente con il filesystem, rispetto ad altre primitive di sincronizzazione. I file persistono facilmente anche attraverso diversi processi. Un programma ad alte prestazioni probabilmente probabilmente preferirebbe le primitive del sistema operativo nativo rispetto ai file per sincronizzare le cose internamente o addirittura rispetto ad altri processi che non sono shell.
LawrenceC,

14

Questi file sono spesso usati dai demoni che dovrebbero essere eseguiti solo una volta su un sistema. Il file PID di solito contiene il numero ID di processo del programma già avviato e in esecuzione, se presente. Inoltre, quando si avvia, crea il file di blocco. Finché esiste il file di blocco, non ne avvierà un altro senza l'intervento dell'utente. Se il file di blocco esiste e l'id di processo menzionato nel file pid non è in esecuzione, il demone è considerato in uno stato "morto", il che significa che dovrebbe essere in esecuzione ma probabilmente non è dovuto a un arresto anomalo o a un arresto improprio . Ciò potrebbe avviare uno scenario speciale di avvio / riavvio per alcuni programmi. Spegnendolo correttamente si rimuoverà il file di blocco.


+1 Spiegare l'uso di avere sia il file lock che il file pid.
Kyle Krull,

@Caleb - Spiegare perché verranno utilizzati sia un file PID che un file di blocco. Sembra che un file PID sarebbe sufficiente. Se esiste il file PID, è possibile controllare il PID per vedere se il processo è in esecuzione, basta fare meno passi del controllo di un file di blocco, verificare la presenza di un file PID e quindi verificare l'esistenza del processo.
MVaughan,

@MVaughan Per evitare le condizioni di gara se non altro. Alcune app hanno usi per i periodi in cui è ancora necessario il PID ma possono rinunciare al blocco. Ma a un livello più fondamentale se si sovraccarica un file per entrambe le operazioni, si apre la porta a guasti come un arresto anomalo che lascia uno stato incoerente sul sistema.
Caleb,

8

Un file PID conterrà l'ID processo di un processo in esecuzione. Questo ha vari usi; puoi leggerlo e verificare che il processo sia ancora in esecuzione e intraprendere le azioni appropriate oppure leggerlo e terminare il processo.

Molto probabilmente un file di blocco è specifico dell'applicazione. I file di blocco vengono utilizzati per indicare che alcune risorse sono in uso e che il processo che richiede l'accesso deve attendere fino al rilascio della risorsa prima di continuare.

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.