A quoi servent les fichiers pid et lock?

75

Je vois souvent que les programmes spécifient les fichiers pid et lock. Et je ne sais pas trop ce qu'ils font.

Par exemple, lors de la compilation de nginx:

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

Quelqu'un peut-il faire la lumière sur celui-ci?

Stann
la source

Réponses:

86

Les fichiers pid sont écrits par certains programmes pour enregistrer leur ID de processus pendant leur démarrage. Cela a plusieurs buts:

  • C'est un signal aux autres processus et aux utilisateurs du système que ce programme particulier est en cours d'exécution ou, du moins, démarré avec succès.
  • Cela permet d'écrire un script très facilement pour vérifier s'il est en cours d'exécution et d'émettre une killcommande en clair si on veut y mettre fin.
  • C'est un moyen peu coûteux pour un programme de voir si une instance en cours d'exécution précédente ne s'est pas terminée avec succès.

La simple présence d'un fichier pid ne garantit évidemment pas que cet identifiant de processus particulier est en cours d'exécution, aussi cette méthode n'est-elle pas à 100% infaillible, mais "assez bonne" dans de nombreux cas. Vérifier si un PID particulier existe dans la table de processus n'est pas totalement portable sur les systèmes d'exploitation de type UNIX, sauf si vous souhaitez dépendre de l' psutilitaire, qu'il n'est peut-être pas souhaitable d'appeler dans tous les cas (et je crois que certains systèmes d'exploitation de type UNIX mettre en œuvre psdifféremment de toute façon).

Les programmes utilisent les fichiers de verrouillage pour s’assurer que deux instances distinctes d’un programme, pouvant s’exécuter simultanément sur un système, ne doivent pas accéder à autre chose en même temps. L'idée est avant que le programme n'accède à sa ressource, il vérifie la présence d'un fichier de verrouillage et, si le fichier de verrouillage existe, une erreur est générée ou attendez qu'il disparaisse. Lorsqu'il n'existe pas, le programme qui souhaite "acquérir" la ressource crée le fichier, puis les autres instances susceptibles de se produire plus tard attendent que ce processus soit terminé. Bien entendu, cela suppose que le programme "acquérant" le verrou libère effectivement et n'oublie pas de supprimer le fichier verrou.

Cela fonctionne parce que le système de fichiers sous tous les systèmes d'exploitation de type UNIX applique la sérialisation , ce qui signifie qu'un seul changement du système de fichiers a lieu à un moment donné. Un peu comme des verrous avec des bases de données et autres.

LawrenceC
la source
1
Ceci est correct, à moins que le fichier de verrouillage ne soit supprimé manuellement. VMWare Player présente ce comportement, par exemple, si VMWare Player se bloque, vous devez supprimer un .lckfichier du répertoire de la machine virtuelle, sinon le système vous indiquera qu'il est en cours d'utilisation lorsque vous essayez de le démarrer.
LawrenceC
1
Qu'en est-il de Windows? Comment gère-t-il les fichiers .lock? Après tout, ce n'est pas comme Unix.
SarahofGaia
2
Je ne pense pas qu'il soit courant que les programmes Windows fonctionnent de cette façon. Les seuls programmes présentant ce comportement que j'ai vus sont des ports Unix / Linux
HaMster
2
LawrenceC, Re " Lorsqu'il n'existe pas, le programme qui souhaite" acquérir "la ressource crée le fichier "; Mais il existe des fonctions appropriées spécialement conçues pour effectuer cette synchronisation. Pourquoi ne pas compter sur ces fonctions au lieu d’utiliser le "hack de fichier"?
Pacerier
1
@Pacerier - Les fichiers verrouillés de cette manière sont probablement plus souvent utilisés par des scripts shell ou des programmes susceptibles d'interagir avec des scripts shell, car les shells Unix / Linux interagissent très facilement avec le système de fichiers, contrairement aux autres primitives de synchronisation. Les fichiers persistent également facilement au travers de processus disparates. Il est évident qu'un programme performant devrait probablement comporter des primitives de système d'exploitation natives par rapport à des fichiers pour synchroniser des éléments en interne ou même par rapport à d'autres processus qui ne sont pas des shells.
LawrenceC
14

Ces fichiers sont souvent utilisés par les démons qui ne doivent être exécutés qu'une seule fois sur un système. Le fichier PID contient généralement le numéro d'ID de processus du programme déjà lancé et en cours d'exécution, le cas échéant. De plus, au démarrage, le fichier de verrouillage est créé. Tant que le fichier de verrouillage existe, il n'en démarrera pas un autre sans l'intervention de l'utilisateur. Si le fichier de verrouillage existe et que l'ID de processus mentionné dans le fichier pid n'est pas en cours d'exécution, le démon est considéré comme étant dans un état "mort", ce qui signifie qu'il est censé être en cours d'exécution mais qu'il n'est probablement pas dû à un blocage ou à un arrêt incorrect. . Cela pourrait initier un scénario spécial de démarrage / redémarrage pour certains programmes. Le fermer correctement supprimera le fichier de verrouillage.

Caleb
la source
+1 Expliquer l'utilisation du fichier de verrouillage et du fichier pid.
Kyle Krull,
@Caleb - Veuillez expliquer pourquoi un fichier PID et un fichier de verrouillage seraient utilisés. Il semble qu'un fichier PID serait suffisant. Si le fichier PID existe, le PID peut être vérifié pour voir si le processus est en cours d'exécution, effectue moins de démarches que la recherche d'un fichier verrou, la recherche d'un fichier PID, puis la vérification de l'existence du processus.
MVaughan
@MVaughan Pour éviter les conditions de course si rien d'autre. Certaines applications ont des utilisations pour les moments où le PID est toujours nécessaire, mais peuvent renoncer au verrou. Mais à un niveau plus fondamental, si vous surchargez un fichier pour les deux opérations, vous ouvrez la porte à des défaillances telles qu'un blocage laissant un état incohérent sur le système.
Caleb
8

Un fichier PID contiendra l'ID de processus d'un processus en cours d'exécution. Cela a divers usages. vous pouvez le lire et vérifier que le processus est toujours en cours d'exécution et prendre les mesures appropriées ou le lire et le tuer.

Un fichier de verrouillage est très probablement spécifique à une application. Les fichiers de verrouillage sont utilisés pour indiquer qu'une ressource est en cours d'utilisation et que le processus de demande d'accès doit attendre que la ressource soit libérée avant de continuer.


la source