Puis-je enchaîner pgrep avec kill?

31

J'ai remarqué que |c'est utilisé pour envoyer les résultats de la première commande à l'autre. Je voudrais tuer tous les processus qui correspondent à un nom.
C'est ce que fait normalement pgrep:

$ pgrep name
5089
5105

Et plusieurs arguments semblent fonctionner avec kill:

sudo kill 5089 5105

Mais c'est faux:

pgrep name | kill

Alors, comment le faire correctement?

Tomáš Zato - Réintégrer Monica
la source
3
pkill. Et si cela n'existait pas, kill $(pgrep ...).
Mikel
Je ne demandais pas seulement à cause de ces commandes spécifiques, mais aussi pour mieux comprendre le chaînage des commandes. Mais comme je peux le voir sur la partition, les questions destinées à comprendre ne sont pas les bienvenues ...
Tomáš Zato - Reinstate Monica
Si vous voulez rendre la question plus générale et vous assurer qu'elle ne fait pas double emploi, je peux voter contre.
Mikel
Désolé, j'ai accidentellement supprimé mon commentaire précédent. Je suis sur une tablette et ce site a de très petits boutons côte à côte.
Mikel
Je disais simplement que j'ai voté contre parce que votre question ne semblait pas demander quoi que ce soit que vous ne pouviez pas apprendre man pgrep. Le bouton downvote indique que c'est pour quand une question ne montre aucun effort de recherche, et je ne pouvais pas en voir dans votre question. Désolé si cela vous a paru dur.
Mikel

Réponses:

42

Essaye ça:

pgrep name | xargs kill

Si vous utilisez pgrep name | kill, la sortie de pgrep nameest transmise à stdin de kill. Parce killque ne lit pas les arguments de stdin, cela ne fonctionnera donc pas.

En utilisant xargs, il construira des arguments pour killdepuis stdin. Exemple:

$ pgrep bash | xargs echo
5514 22298 23079
cuonglm
la source
5
Rien à voir avec l'espace par rapport à la nouvelle ligne. Tout simplement parce que kill ne lit pas les arguments sur stdin.
Mikel
@Mikel: Mon erreur, corrigée.
cuonglm
17

Cela devrait fonctionner:

pkill name

Je suggère également de lire la page de manuel.

Rouben Tchakhmakhtchian
la source
5

Répondre au général plutôt qu'au spécifique ...

Les canaux permettent de transmettre la sortie d'un programme en entrée à un autre programme.

Il semble que vous essayez d'utiliser la sortie d'un programme comme arguments de ligne de commande pour un autre programme, ce qui est différent.

Pour ce faire, utilisez la substitution de commandes .

Par exemple, si vous souhaitez exécuter

sudo kill 5089 5105

Et vous avez une commande pgrep namequi sort5089 5105

Vous les mettez ensemble comme

sudo kill $(pgrep name)
Mikel
la source
Merci beaucoup. J'espère que cela aidera aussi d'autres débutants.
Tomáš Zato - Rétablir Monica le