Question

Où puis-je trouver un référence respecté qui détaille la manipulation correcte des fichiers PID sur Unix?

Sur les systèmes d'exploitation Unix, il est pratique courante de « verrouiller » un programme (souvent un démon) par l'utilisation d'un fichier de verrouillage spécial:. Le fichier PID

Ceci est un fichier dans un emplacement prévisible, souvent « /var/run/foo.pid ». Le programme est censé vérifier quand il démarre si le fichier PID existe et, si le fichier existe, la sortie avec une erreur. Il est donc une sorte de conseil, mécanisme de verrouillage de collaboration.

Le fichier contient une seule ligne de texte, étant l'ID de processus numérique (d'où le nom « fichier PID ») du processus qui détient actuellement la serrure; ce qui permet un moyen facile d'automatiser l'envoi d'un signal au processus qui détient le verrou.

Ce que je ne peux pas trouver une bonne référence sur le comportement attendu ou « meilleures pratiques » pour gérer des fichiers PID. Il y a différentes nuances: comment verrouiller effectivement le fichier (ne prenez pas la peine d'utiliser le noyau que sur les incompatibilités de la plate-forme??), La manipulation verrous périmés (les supprimer en silence quand vérifier?), Quand exactement à acquérir et à libérer le verrou et ainsi de suite.

Où puis-je trouver un pour ce petit sujet respecté, référence la plus-autorité (idéalement au niveau de W. Richard Stevens)?

Était-ce utile?

La solution

Pour autant que je sache, les fichiers PID sont une convention plutôt que quelque chose que vous pouvez trouver une source respectée, la plupart du temps faisant autorité pour. Le plus approchante est cette section de la Filesystem Hierarchy Standard.

Cette bibliothèque Perl pourrait être utile, car il ressemble à la auteur a au moins réfléchi à certaines questions que peuvent se poser.

Je crois que les fichiers sous / var / run sont souvent gérées par les mainteneurs distro plutôt que daemons des auteurs, puisque ce sont les mainteneurs distro de la responsabilité de veiller à ce que tous les scripts d'initialisation jouent bien ensemble. J'ai vérifié la documentation des développeurs de Debian et Fedora et ne pouvait pas trouver des lignes directrices détaillées, mais vous pourriez être en mesure d'obtenir plus d'informations sur les listes de diffusion de leurs développeurs.

Autres conseils

Tout d'abord, sur tous les Unix modernes /var/run ne persiste pas dans les redémarrages.

La méthode générale pour traiter le fichier de PID est de le créer lors de l'initialisation et le supprimer de sortie quelconque, soit gestionnaire normale ou du signal.

Il y a deux façons canoniques pour créer atomiquement / vérifier le fichier. La principale ces jours-ci est de l'ouvrir avec le drapeau O_EXCL: si le fichier existe déjà, l'appel échoue. L'ancienne (obligatoire sur les systèmes sans O_EXCL) est de créer avec un nom aléatoire et lien vers elle. Le lien échouera si la cible existe.

Voir les L'interface de programmation Linux, section 55,6 " Running Just One instance d'un programme " qui repose sur la mise en œuvre de pidfile dans la programmation réseau Unix Stevens, v2.

Notez également que l'emplacement du pidfile est généralement quelque chose géré par le distro (via un script d'initialisation), donc un démon bien écrit prendra un argument de ligne de commande pour spécifier le pidfile et ne pas permettre que cela soit accidentellement écrasé par un fichier de configuration. Il doit également gérer gracieusement un fichier pid vicié par lui-même (O_EXCL ne doit pas être utilisé). verrouillage de fichier fcntl () doit être utilisé -. vous pouvez supposer que le pidfile d'un démon est situé sur un système de fichiers local (non NFS)

En fonction de la distribution, le fait le script d'initialisation qui gère la pidfile. Il vérifie l'existence au démarrage, supprime en cas d'arrêt, etc. Je n'aime pas le faire de cette façon. Je vous écris mes propres scripts d'initialisation et ne généralement pas utiliser les fonctions d'initialisation de stanard.

Un programme bien écrit (démon) aura une sorte de fichier de configuration dire où cette pidfile (le cas échéant) doit être écrit. Il prendra également soin d'établir les gestionnaires de signaux afin que le fichier PID est nettoyé à la sortie normale ou anormale, chaque fois qu'un signal peut être manipulé. Le fichier PID donne alors le script d'initialisation du PID correct de sorte qu'il peut être arrêté.

Par conséquent, si le pidfile existe déjà lors du démarrage, est un très bon indicateur au programme qu'il est écrasé auparavant et devrait faire une sorte d'effort de récupération (le cas échéant). Vous tirez sorte de cette logique dans le pied si vous avez le script d'initialisation de vérifier lui-même l'existence du PID ou déliant il.

En ce qui concerne l'espace de nom, il doit suivre le nom du programme. Si vous commencez « foo-démon », il serait foo-daemon.pid

Vous devriez aussi explorer / var / lock / subsys, mais qui est utilisé principalement sur les saveurs Red Hat.

Le paquet systemd sur Red Hat 7 fournit un homme avec la page daemon(7) la ligne d'en-tête "daemons système d'écriture et d'emballage."

Cette page de manuel traite à la fois "old style" (SysV) et "nouveau style" (systemd) démonisation. Dans un nouveau style, les poignées se systemd les fichiers PID pour vous (si configuré pour le faire). Cependant, dans un style ancien, la page de manuel a ceci à dire:

  
      
  1. Dans le processus démon, le démon écrire PID (comme retourné par getpid ())          dans un fichier de PID, par exemple /run/foobar.pid (pour un démon hypothétique          « Foobar ») afin d'assurer que le démon ne peut être démarré plus d'une fois.          Celle-ci doit être mis en œuvre en mode sans course afin que le fichier PID est          seulement mis à jour quand on vérifie en même temps que le PID          précédemment enregistré dans le fichier PID n'existe plus ou appartient à une          processus étrangers.
  2.   

Vous pouvez également lire cette page man en ligne .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top