Existe-t-il une forme plus compacte de suppression des tâches en arrière-plan que:
for i in {1..5}; do kill %$i; done
De plus, {1..5} contient évidemment un nombre magique codé en dur. Comment puis-je le faire "N", N étant le bon nombre, sans faire un:
$(jobs | wc -l)
J'utilise réellement \ j dans PS1 pour obtenir le nombre de travaux gérés. Est-ce équivalent?
kill $(jobs -p)
semble plus facile.for pid in $(jobs -p); do kill $pid; done
?jobs
qui ne fonctionne que si les tâches sont numérotées de manière consécutive. Oh, et «tuer les travaux individuellement» n'a pas de sens: transmettre plusieurs PID à lakill
commande revient exactement à les transmettre séparément.Réponses:
Pour seulement
kill
tous les jobs d'arrière-plan gérés parbash
,Notez que puisque les deux
jobs
etkill
sont intégrés dansbash
, vous ne devriez pas avoir des erreurs de la liste d'arguments trop longue de type.la source
zsh
disqualifie en tant qu’autorité sur le sujet.kill %${(k)^jobdirs}
ce qui est effectivement plus long; si vous devez répertorier les PID, vous pouvez utiliser le plus long${${jobstates#*:*:}%%=*}
.>
Utilisez à la
xargs
place de la$(jobs -p)
sous - commande, car sijobs -p
est vide, la commande kill échouera.la source
jobs -p | xargs -rn10 kill
fera mieux mieux sijobs -p
ne renvoie aucun PID. Notez que cette-r
option est l’extension GNU.-r
s'agit du format abrégé de l'--no-run-if-empty
extension GNU,xargs
qui lui indique de ne pas exécuter la commande si stdin ne contient aucune donnée.Je préfère vérifier s'il y a des emplois existants avant de les tuer - de cette façon, le script ne va pas échouer si rien ne tourne.
C'est aussi plus court pour taper. Jetez ceci dans votre
.bash_profile
:Puis lancez:
Pour tuer tous les travaux en cours d'exécution.
la source
J'ai plusieurs commandes composées en arrière-plan que je souhaite terminer avec élégance, en envoyant SIGINT à chaque processus, sur macOS. Aucune des autres solutions ne fonctionnait correctement pour cela, alors je suis venu avec ceci:
jobs -p
liste les processus en arrière-plan démarrés par le shell actuel.xargs -n1
exécute pkill une fois pour chaque travail.pkill -SIGINT -g
envoie SIGINT (comme ctrl + c) à tous les processus du groupe de processus.la source
Je suppose que selon la sortie
jobs -p
, la solution pourrait être légèrement différente. Dans mon casPar conséquent, ce qui suit n’est pas bon.
D'autre part, l'exécution
kill $(jobs -p)
fonctionne, mais entraîne beaucoup de messages d'erreur, car les chaînes non PID sont également transmiseskill
.Par conséquent, ma solution consiste à
grep
utiliser d'abord le PID, puis à l'utiliserxargs
comme suit:la source
echo $0
montre? Quehelp jobs
montre? La sortie illustrée n’est pas conforme à POSIX ; toute implémentation dejobs
devrait avoir une-p
option avec le comportement souhaité.jobs -p
n'ai généré que le PID. Je viens d'apprendre que zsh n'est pas complètement compatible POSIX.On dirait que
jobs -p | xargs kill
ça fait le boulot, mais ça produit des sorties indésirables qui vont être tuées. Je regroupe ici la sortie dejobs -p
en ayant / ne pas avoir le caractère + ou -Et plus tard, vous pouvez simplement appeler
killjobs
la source