Comment puis-je tuer la dernière tâche d'arrière-plan générée sous Linux?
Exemple:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Comment puis-je tuer la dernière tâche d'arrière-plan générée sous Linux?
Exemple:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Réponses:
Il y a une variable spéciale pour cela dans bash:
kill $!
$! se développe en PID du dernier processus exécuté en arrière-plan.
^Zne crée pas d'arrière-plan, il les arrête. Un suivant bgfait le «backgrounding» réel (reprend l'exécution en arrière-plan), et après cela $!fonctionne comme prévu.
????stands représentent une ou plusieurs commandes à exécuter après la mise à mort, si l'une de ces commandes repose sur le travail effectué par le processus d'arrière-plan, soyez attentif à toutes les tâches de nettoyage ou de finition que le processus d'arrière-plan pourrait effectuer dans un gestionnaire de signaux après recevoir un signal (captable). Il est préférable d'ajouter un wait(suivi peut-être d'un syncou même d'un sleep <n>) juste avant la première de ces commandes «dépendantes».
Vous pouvez tuer par numéro de travail. Lorsque vous mettez une tâche en arrière-plan, vous verrez quelque chose comme:
$ ./script &
[1] 35341
C'est [1]le numéro de la tâche et peut être référencé comme:
$ kill %1
$ kill %% # Most recent background job
Pour voir une liste des numéros de tâche, utilisez la jobscommande. Plus de man bash:
Il existe plusieurs façons de faire référence à un travail dans le shell. Le personnage
%introduit un nom de travail. Le numéro de postenpeut être appelé%n. Un travail peut également être référencé en utilisant un préfixe du nom utilisé pour le démarrer, ou en utilisant une sous-chaîne qui apparaît dans sa ligne de commande. Par exemple,%cefait référence à uncetravail arrêté . Si un préfixe correspond à plusieurs travaux, bash signale une erreur. L'utilisation%?ce, d'autre part, fait référence à tout travail contenant la chaînecedans sa ligne de commande. Si la sous-chaîne correspond à plusieurs travaux, bash signale une erreur. Les symboles%%et%+se référer à la notion du shell du travail en cours, qui est le dernier travail arrêté alors qu'il était au premier plan ou démarré en arrière-plan. Le travail précédent peut être référencé à l'aide de%-. Dans la sortie relative aux travaux (par exemple, la sortie de la commande jobs), le travail en cours est toujours signalé par un+et le travail précédent par un-. Un seul%(sans spécification de tâche associée) fait également référence à la tâche actuelle.
set -m), il est destiné à une utilisation interactive. Voir stackoverflow.com/questions/690266/... aussi bien
%1- ci et %%- surtout. Certaines choses ne meurent pas en Ctrl-C, vous devez donc les Ctrl-Z, puis kill -9 %%. Un exemple où je l'ai trouvé utile est: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Ctrl-C vous amènera simplement à la prochaine itération de la boucle. Avant je devais faire psou peut jobs -l- être , puis retaper le PID, ce qui est fastidieux.
while truepar while sleep 1. Cela vous donnera un court délai avant de redémarrer si vous pouvez vivre avec cela, et si vous appuyez deux fois sur ctrl-c, le second interrompra le sommeil, le terminant par une sortie non nulle et sortant de la boucle.
Cela devrait tuer tous les processus d'arrière-plan:
jobs -p | xargs kill -9
kill -9 %%c'est moins en tapant :)
c'est une réponse hors sujet, mais, pour ceux qui sont intéressés, elle peut être utile.
Comme dans la réponse de @John Kugelman,% est lié à la spécification du poste. comment trouver cela efficacement? utilisez moins la commande & pattern , l'homme semble utiliser moins de téléavertisseur (pas si sûr), dans man bash tapez &% puis tapez Enter n'affichera que les lignes contenant '%', pour tout afficher, tapez &. puis entrez.
Utilisez simplement la commande killall:
nom de tâche killall
pour plus d'informations et des options plus avancées, tapez "man killall".
killall pythonou killall java, tout en ayant quelque chose d'utile en cours d'exécution ailleurs dans le système.