Si, en bash
, j'exécute:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
où le cmd{1..n}
peut ne pas être distinct, comment puis-je obtenir le PID de cmdi
? Sinon, comment puis-je signaler le cmdi
processus? (Par exemple, envoyez-le SIGUSR1
?)
pkill
/ pgrep
, pidof
Etc. ne semblent pas être de bonnes réponses, car d'autres instances de cmdi
peut - être en cours d'exécution, y compris dans le cadre du même pipeline. jobs -p
donne le PID de cmd1
, pour moi.
i
peut être n'importe quoi {1..n}
.
bash
shell
pipe
job-control
muru
la source
la source
cat /var/run/out | nc -l 8080
est seulement superficiellement similaire àcmd1 | cmd2
? Votre contrainte, que vous souhaitiez taper le pipeline bare-bones puis récupérer les PID, n'est (1) pas indiquée dans la question, et (2) est peu susceptible de permettre une bonne solution générale.cmd1 | cmd2
est un cas très spécial où les deux PID sont facilement accessibles. Ai-je dit quelque chose sur n? Alors pourquoi supposeriez-vous que n = 2? Ai-je dit quoi que ce soit cmdi? Alors pourquoi supposeriez-vous que je pourrais modifier cmdi? Je demande une solution générale et vous imposez des restrictions.Réponses:
Pour la version originale de la question, lorsque seul le PID de la dernière commande était souhaité, la variable spéciale
$!
est parfaite.Il n'y a pas d'accès facile similaire aux PID des autres processus.
L' ajout de
$pipestatus
(zsh) et$PIPESTATUS
(bash) a pris beaucoup de temps , nous donnant enfin accès à tous les états de sortie dans un pipeline, en plus$?
du dernier qui existe depuis le shell Bourne d'origine. Peut-être que quelque chose d'analogue se produira$!
éventuellement.la source
Je pense que vous pourriez faire quelque chose comme suggéré ici .
Ici, dans l'exemple ci-dessus, j'ai récupéré le pid du troisième processus canalisé et l'ai noté dans le fichier pid. Je pourrais le noter pour tout processus canalisé.
la source
jobs -p
. signaler avecSIGPIPE
. Voulez-vouscmdi
- ceci.Une solution peu portable et spécifique à Linux pourrait être de suivre les processus à l'aide des canaux qui les connectent. Nous pouvons obtenir les PID des commandes first (
jobs -p
) et last ($!
) dans le pipeline. En utilisant l'un ou l'autre PID, ce script pourrait faire le travail:la source
J'utilise des tableaux basés sur zéro ici dans ce code. Faites juste attention à ce que vous dirigez
eval
.la source