Comment get le process pid du process commencé

Je veux commencer le process (p. Ex. MyCommand) et get son pid (pour permettre de le tuer plus tard).

J'ai essayé ps et filterz par nom, mais je ne peux pas distinguer le process par des noms

myCommand ps ux | awk '/<myCommand>/ {print $2}' 

Parce que les noms de process ne sont pas uniques.

Je peux exécuter le process en:

 myCommand & 

J'ai trouvé que je peux get ce PID par:

 echo $! 

Existe-t-il une solution plus simple?

Je serais heureux d'exécuter myCommand et d'get son PID à la suite d'une command de ligne.

Quoi de plus simple que echo $! ? En une seule ligne:

 myCommand & echo $! 

Enrouler la command dans un petit script

 #!/bin/bash yourcommand & echo $! >/path/to/pid.file 

Je ne connais aucune solution plus simple, mais n'utilise pas $! assez bien? Vous pouvez toujours atsortingbuer la valeur à une autre variable si vous en avez besoin plus tard, comme l'ont dit d'autres.

Comme une note latérale, au lieu de la tuyauterie de ps, vous pouvez utiliser pgrep ou pidof .

utilisez exec à partir d'un script bash après avoir enregistré le pid dans un file:

Exemple:

Supposons que vous ayez un script nommé "forever.sh" que vous souhaitez exécuter avec args p1, p2, p3

code source forever.sh:

 #!/bin/sh while [ 1 -lt 2 ] ; do logger "$0 running with parameters \"$@\"" sleep 5 done 

crée un reaper.sh:

 #!/bin/sh echo $$ > /var/run/$1.pid exec "$@" 

exécutez forever.sh à travers reaper.sh:

 ./reaper.sh ./forever.sh p1 p2 p3 p4 & 

forever.sh ne fait rien d'autre que l'logging d'une ligne vers syslog toutes les 5 secondes

vous avez maintenant le pid dans /var/run/forever.sh.pid

 cat /var/run/forever.sh.pid 5780 

et forever.sh exécute aok. syslog grep:

 Nov 24 16:07:17 pinkpony cia: ./forever.sh running with parameters "p1 p2 p3 p4" 

vous pouvez le voir dans la table des process:

 ps axuwww|grep 'forever.sh p1' |grep -v grep root 5780 0.0 0.0 4148 624 pts/7 S 16:07 0:00 /bin/sh ./forever.sh p1 p2 p3 p4 

Vous pouvez utiliser quelque chose comme:

 $ myCommand ; pid=$! 

Ou

 $ myCommand && pid=$! 

Les deux commands peuvent être des joints en utilisant ; ou && . Dans le second cas, le pid sera configuré uniquement si la première command réussit. Vous pouvez get l'identifiant de process à partir de $pid .

C'est un peu une réponse hack-y et ne fonctionnera probablement pas pour la plupart des gens. C'est aussi un énorme danger pour la security, alors ne le faites pas à less d'être sûr que vous serez en security et que les intrants sont désinfectés et … eh bien, vous avez l'idée.

Comstackz le petit programme C ici dans un start appelé binary (ou ce que vous voulez), puis exécutez votre programme sous ./start your-program-here arg0 arg1 arg2 ...

 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char **argv) { if (argc >= 2) { printf("%lu\n", (long unsigned) getpid()); if (execvp(argv[1], &argv[1]) < 0) { perror(NULL); return 127; } } return 0; } 

Longue histoire, cela imprimera le PID à stdout , puis chargez votre programme dans le process. Il devrait toujours avoir le même PID.

Dans le bash shell, une alternative à $! peut-être les jobs -p embeddeds. Dans certains cas, le ! en $! est interprété par le shell avant (ou plutôt) l'expansion variable, ce qui entraîne des résultats inattendus.

Ceci, par exemple, ne fonctionnera pas:

 ((yourcommand) & echo $! >/var/run/pidfile) 

alors que ceci:

 ((yourcommand) & dir -p >/var/run/pidfile)