Le PID d'un processus enfant bash (imapsync) - comment l'obtenir?

15

Quelqu'un peut-il me dire comment obtenir le PID d'une commande exécutée dans bash.

Par exemple, j'ai un script bash qui exécute imapsync.

Lorsque le script est tué, le processus imapsync n'est pas toujours tué, donc j'aimerais pouvoir identifier le PID d'imapsync par programme à partir de mon script, afin de pouvoir tuer le processus imapsync moi-même dans un gestionnaire de signaux.

Alors, comment puis-je obtenir par programme le PID d'un processus enfant à partir d'un script bash parent?

Jason Tan
la source
1
Que diriez-vous de "pidof imapsync"? Qu'est ce qui ne va pas avec ça?
pitr
2
Je ne connaissais pas pidof. Cependant, maintenant que je le fais, il n'est pas utile pour ce scénario pour autant que je sache, car pidof semble renvoyer tous les processus de la commande donnée sur un système - même ceux appartenant à d'autres scripts / utilisateurs. De plus, imapsync est en fait un script perl, donc je ferais un pidof perl, qui encore une fois est susceptible de renvoyer des processus qui ne sont pas imapsync et peuvent appartenir à d'autres utilisateurs.
Jason Tan
Javier a raison. Cette page offrira plus d'informations sur ProcessManagement .
péché le

Réponses:

4

imapsync a une option pour définir où son pid est écrit:

--pidfile: le fichier où le pid imapsync est écrit.

Gilles LAMIRAL
la source
Pour info, cela ne répond pas vraiment à ma question dans un sens général, mais j'ai découvert l'argument --pidfile et avec quelques faffings autour il a été assez bon jusqu'à présent ..
Jason Tan
@JasonTan pourquoi apprendre à un homme à pêcher, quand vous pouvez lui donner un délicieux filet précuit, alors il revient et vous harcèle pour plus, demain, hein? désolé pour l'ancien poste, mais pourquoi accepter cette réponse par rapport à Javiers?
non synchronisé
46
any_command args &
my_child_PID=$!

IOW, tout comme $$détient votre PID, $!possède le PID de la commande d'arrière-plan la plus récemment exécutée .

Javier
la source
Merci, mais imapsync n'est pas en arrière-plan et $! n'est pas défini si je le fais écho sur la ligne suivante après l'invocation imapsync ou la première ligne du gestionnaire de signal. :-(
Jason Tan
6
si elle bifurque et donne des antécédents à l'enfant, il incombe au parent de sauvegarder le PID de l'enfant quelque part. la pratique habituelle est de l'enregistrer quelque part comme /var/run/whatever.pid. Il y a peut-être une option en ligne de commande pour lui demander d'enregistrer le PID quelque part; sinon, cela ressemble à une fonctionnalité à demander à l'auteur ou à mettre en œuvre vous-même.
Javier
1
Accent sur les antécédents . Si aucun processus n'a été placé en arrière-plan (c'est-à-dire avec en annexe &), la $!variable n'est pas définie.
Trevor
1
Des solutions plus similaires sont suggérées dans (une réponse à) Comment obtenir le pid du processus qui vient de commencer ; en plus de cette réponse, un commentaire dit: oh, et le "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 novembre 10 à 14:28
imz - Ivan Zakharyaschev
10

Contrairement à pidof, il pgreppeut être donné une variété d'options pour restreindre les processus pour lesquels il renvoie des PID. Un qui peut être particulièrement utile est de sélectionner en fonction de PPID en utilisant le PID du processus actuel.

pgrep -P $$ imapsync

qui ne sortira les PID de imapsync que s'ils sont des enfants de votre script.

En pause jusqu'à nouvel ordre.
la source
0

Que diriez-vous de mettre imapsync en arrière-plan momentanément, d'obtenir le PID puis de le mettre au premier plan ... Quelque chose comme ceci:

imapsync &
pid=$!
wait $pid
retVal=$?
marque
la source