Comment cela peut-il ne pas être lié à la programmation? La programmation basique n'est pas de la programmation?
flybywire
6
C'est dans la région de chevauchement entre SO et SU, mais je pense que cela correspond mieux ici sur SO. Mon critère pour penser de cette façon est que si @flybywire le fait dans un script, c'est de la programmation. S'il voulait juste le faire à partir de la ligne de commande, je dirais qu'il appartient à SU.
Bill the Lizard
10
Les scripts shell sont également en programmation.
cletus
Réponses:
234
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.
@ polm23; non, ^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.
falstro
En supposant que les ????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».
ack
2
Pour l'achèvement: comme un seul% fait également référence au travail en cours, vous pouvez tuer le travail arrêté (^ z) avec "tuer%". Je l'utilise presque toujours après ^ z.
t3o
Cela ne fonctionne que si vous avez activé le contrôle des tâches, qui n'est activé que par défaut dans les shells interactifs (bien que puisque vous faites référence à l'utilisation de ctrl-z, je suppose que vous faites également référence à l'utilisation d'un shell interactif) - mais cela a été décrit dans d'autres réponses ici,
je
289
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 poste npeut ê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 à un cetravail 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îne cedans 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.
Pour mémoire, je pense que cela ne fonctionne que si le contrôle des travaux est activé. Bien que je pense que vous pouvez l'activer dans des scripts ( set -m), il est destiné à une utilisation interactive. Voir stackoverflow.com/questions/690266/... aussi bien
falstro
9
Symboles très utiles, ceux %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.
Tomasz Gandor
Y en a-t-il un pour tous les emplois?
CMCDragonkai
3
@TomaszGandor C'est pourquoi vous voudrez peut-être le remplacer 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.
falstro
45
La commande suivante vous donne une liste de tous les processus d'arrière-plan de votre session, ainsi que le pid. Vous pouvez ensuite l'utiliser pour tuer le processus.
C'est ce que j'utilisais auparavant, mais kill -9 %%c'est moins en tapant :)
Tomasz Gandor
4
@TomaszGandor Cela ne tuera que le travail en cours, c'est-à-dire le dernier travail arrêté au premier plan ou démarré en arrière-plan. La commande dans la réponse supprimera TOUS les travaux.
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.
Réponses:
Il y a une variable spéciale pour cela dans bash:
$! se développe en PID du dernier processus exécuté en arrière-plan.
la source
^Z
ne crée pas d'arrière-plan, il les arrête. Un suivantbg
fait 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 unwait
(suivi peut-être d'unsync
ou même d'unsleep <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:
C'est
[1]
le numéro de la tâche et peut être référencé comme:Pour voir une liste des numéros de tâche, utilisez la
jobs
commande. Plus deman bash
:la source
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, puiskill -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 faireps
ou peutjobs -l
- être , puis retaper le PID, ce qui est fastidieux.while true
parwhile 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.La commande suivante vous donne une liste de tous les processus d'arrière-plan de votre session, ainsi que le pid. Vous pouvez ensuite l'utiliser pour tuer le processus.
Exemple d'utilisation:
la source
Cela devrait tuer tous les processus d'arrière-plan:
la source
kill -9 %%
c'est moins en tapant :)skill
est une version de la commande kill qui vous permet de sélectionner un ou plusieurs processus en fonction d'un critère donné.la source
Vous avez besoin de son pid ... utilisez "ps -A" pour le trouver.
la source
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.
la source
Utilisez simplement la commande killall:
nom de tâche killall
pour plus d'informations et des options plus avancées, tapez "man killall".
la source
killall python
oukillall java
, tout en ayant quelque chose d'utile en cours d'exécution ailleurs dans le système.