Donnez plus de détails. Voulez-vous l'arrêter de manière interactive ou par programme?
manatwork
1
vous pouvez appuyer sur ctrl-cpour envoyer le SIGINTsignal (dans la plupart des coques) ou sur ctrl-zqui envoie le SIGTSTPsignal (dans la plupart des coques). Dans le cas où vous avez appuyé sur ctrl-zle processus associé, ce n'est pas tué, mais en pause. Vous pouvez le reprendre avec fg(au moins dans bash)
user1146332
Non, ça ne marche pas!
Yinyanghu
4
Le problème n’est pas le script, mais la slcommande que j’estime être une commande annotante pour ceux qui mal orthographient ls, montrant un train qui passe lentement. Autant que je sache, il intercepte le SIGINTsignal et doit être tué SIGKILL.
1
Merci. Pas emballé pour ma distribution, c'est pourquoi je ne l'ai pas su / trouvé. (Je pense que je ne vais pas déposer une demande pour cela.)
manatwork
Réponses:
64
Le programme slignore délibérément SIGINT, ce qui est envoyé lorsque vous appuyez sur Ctrl+C. Donc, tout d’abord, vous devrez dire de slne pas ignorer SIGINTen ajoutant l’ -eargument.
Si vous essayez ceci, vous remarquerez que vous pouvez arrêter chaque individu sl, mais ils répètent encore. Vous devez aussi dire bashde quitter après SIGINT. Vous pouvez le faire en mettant un trap "exit" INTavant la boucle.
Je ne l'ai pas installé pour le vérifier, mais vous pourrez peut-être aussi le tuer avec SIGQUIT de Ctrl- \
derobert le
121
appuyez sur Ctrl-Zpour suspendre le script
kill %%
Le %%dit le bash intégré killque vous voulez envoyer un signal (SIGTERM par défaut) pour le travail de fond le plus récemment suspendu dans la coquille en cours, et non à un processus id.
Vous pouvez également spécifier des travaux par numéro ou par nom. Par exemple, lorsque vous suspendez un travail avec ^ Z, bash vous indiquera quel est son numéro de travail avec quelque chose comme [n]+ Stopped, où l' nintérieur entre crochets est le numéro du travail.
Pour plus d' informations sur le contrôle de l' emploi et sur les emplois à tuer, courir help jobs, help fg, help bget help killen bash, et rechercher JOB CONTROL(majuscules) ou jobspecdans la page de manuel bash.
par exemple
$ ./killme.sh
./killme.sh: ligne 4: sl: commande non trouvée
./killme.sh: ligne 4: sl: commande non trouvée
./killme.sh: ligne 4: sl: commande non trouvée
./killme.sh: ligne 4: sl: commande non trouvée
./killme.sh: ligne 4: sl: commande non trouvée
...
...
...
./killme.sh: ligne 4: sl: commande non trouvée
^ Z
[1] + Stopped ./killme.sh
$ kill %%
$
[1] + Terminé ./killme.sh
Dans cet exemple, le numéro de travail était 1, il kill %1aurait donc fonctionné de la même manière quekill %%
(NOTE: Je n'ai pas sl. Installé de sorte que la sortie est juste « command not found » dans votre cas, vous obtiendrez ce que la sortie sl produit , il n'a pas d' importance - la. ^ZSuspendent et kill %%travaillerez même)
BTW, pour exécuter rapidement des boucles comme celle-ci, ^ Z peut être un moyen plus fiable de tuer le processus que ^ C. ^ C sera envoyé au programme ( sl) en cours d'exécution dans la boucle, mais le script continuera à s'exécuter ... et en démarrera un autre sl. Si vous appuyez rapidement plusieurs fois sur ^ C, vous pouvez tuer slle script et le script (si aucun d’eux ne piège SIGINT). ^ Z suspendra le script presque immédiatement (immédiatement si vous ne comptez pas la sortie en mémoire tampon qui est encore en cours d'impression sur votre terminal), afin que vous puissiez le tuer aveckill %%
cas
Exactement! Je dois dire " slest un programme amusant". Cette fois, ça m'amuse encore! @ _ @
Yinyanghu le
Seule réponse qui semble fonctionner également lorsque la boucle n'est pas appelée à partir d'un script, mais directement en ligne de commande.
Skippy le Grand Gourou
1
@DrewChapin Je ne me souviens plus du moment ni de l'endroit où je l'ai découvert - c'est quelque chose que je connais "depuis toujours". La page de manuel bash (recherche jobspec ) dit:The symbols %% and %+ refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background. The previous job may be referenced using %-. If there is only a single job, %+ and %- can both be used to refer to that job
ČAS
7
Si vous voulez que ctrl + c arrête la boucle mais ne termine pas le script, vous pouvez placer || breakaprès la commande que vous exécutez. Tant que le programme que vous exécutez se termine sur ctrl + c, cela fonctionne très bien.
#!/bin/bashwhile:do# ctrl+c terminates sl, but not the shell script
sl -e ||breakdone
Si vous êtes dans une boucle imbriquée, vous pouvez utiliser "break 2" pour sortir de deux niveaux, etc.
Vous pouvez terminer ce script en appuyant sur Ctrl + C depuis le terminal où vous avez commencé ce script. Bien sûr, ce script doit être exécuté en avant-plan pour pouvoir être arrêté par Ctrl + C.
Ou vous pouvez trouver le PID (ID de processus) de ce script dans un autre terminal ouvert en:
Il ne peut pas être terminé par Ctrl + C à partir du terminal. Je dois donc le tuer par ps ou en haut. Je veux juste savoir comment le tuer directement!
Yinyanghu
3
Le moyen le plus simple est d’émettre le QUITsignal, qui est généralement associé à Control-Backslash.
Vous pouvez killle pidde shell (bash).
Je viens d'essayer et ça marche.
Parce que je ne peux pas voir le processus ps -ef(le travail que nous exécutons dans le script en boucle).
Une autre façon de terminer le script entier consiste à mettre en arrière-plan la slcommande, puis à intercepter le signal INTafin de tuer le groupe de processus entier du script avec signal HUP.
Pourquoi pensez-vous que le PID de la dernière commande d'arrière-plan sera 0?
manatwork
-1
Le meurtre est affreux, parce que vous ne devez plus jamais si le script doit être exécuté deux fois. ET votre code de sortie est faux.
while[ something ];doif[ somethingelse ];then
echo shut down script with exit code 0
exit 0fidone
echo something else not happend
exit 2# Return val important for example for monitoring
Ne pas travailler. Solution = utilisez perl. en ouvrant sa propre bash
ctrl-c
pour envoyer leSIGINT
signal (dans la plupart des coques) ou surctrl-z
qui envoie leSIGTSTP
signal (dans la plupart des coques). Dans le cas où vous avez appuyé surctrl-z
le processus associé, ce n'est pas tué, mais en pause. Vous pouvez le reprendre avecfg
(au moins dansbash
)sl
commande que j’estime être une commande annotante pour ceux qui mal orthographientls
, montrant un train qui passe lentement. Autant que je sache, il intercepte leSIGINT
signal et doit être tuéSIGKILL
.Réponses:
Le programme
sl
ignore délibérémentSIGINT
, ce qui est envoyé lorsque vous appuyez sur Ctrl+C. Donc, tout d’abord, vous devrez dire desl
ne pas ignorerSIGINT
en ajoutant l’-e
argument.Si vous essayez ceci, vous remarquerez que vous pouvez arrêter chaque individu
sl
, mais ils répètent encore. Vous devez aussi direbash
de quitter aprèsSIGINT
. Vous pouvez le faire en mettant untrap "exit" INT
avant la boucle.la source
Ctrl-Z
pour suspendre le scriptkill %%
Le
%%
dit le bash intégrékill
que vous voulez envoyer un signal (SIGTERM par défaut) pour le travail de fond le plus récemment suspendu dans la coquille en cours, et non à un processus id.Vous pouvez également spécifier des travaux par numéro ou par nom. Par exemple, lorsque vous suspendez un travail avec ^ Z, bash vous indiquera quel est son numéro de travail avec quelque chose comme
[n]+ Stopped
, où l'n
intérieur entre crochets est le numéro du travail.Pour plus d' informations sur le contrôle de l' emploi et sur les emplois à tuer, courir
help jobs
,help fg
,help bg
ethelp kill
en bash, et rechercherJOB CONTROL
(majuscules) oujobspec
dans la page de manuel bash.par exemple
Dans cet exemple, le numéro de travail était 1, il
kill %1
aurait donc fonctionné de la même manière quekill %%
(NOTE: Je n'ai pas
sl
. Installé de sorte que la sortie est juste « command not found » dans votre cas, vous obtiendrez ce que la sortie sl produit , il n'a pas d' importance - la.^Z
Suspendent etkill %%
travaillerez même)la source
sl
) en cours d'exécution dans la boucle, mais le script continuera à s'exécuter ... et en démarrera un autresl
. Si vous appuyez rapidement plusieurs fois sur ^ C, vous pouvez tuersl
le script et le script (si aucun d’eux ne piège SIGINT). ^ Z suspendra le script presque immédiatement (immédiatement si vous ne comptez pas la sortie en mémoire tampon qui est encore en cours d'impression sur votre terminal), afin que vous puissiez le tuer aveckill %%
sl
est un programme amusant". Cette fois, ça m'amuse encore! @ _ @The symbols %% and %+ refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background. The previous job may be referenced using %-. If there is only a single job, %+ and %- can both be used to refer to that job
Si vous voulez que ctrl + c arrête la boucle mais ne termine pas le script, vous pouvez placer
|| break
après la commande que vous exécutez. Tant que le programme que vous exécutez se termine sur ctrl + c, cela fonctionne très bien.Si vous êtes dans une boucle imbriquée, vous pouvez utiliser "break 2" pour sortir de deux niveaux, etc.
la source
Vous pouvez terminer ce script en appuyant sur Ctrl + C depuis le terminal où vous avez commencé ce script. Bien sûr, ce script doit être exécuté en avant-plan pour pouvoir être arrêté par Ctrl + C.
Ou vous pouvez trouver le PID (ID de processus) de ce script dans un autre terminal ouvert en:
Les deux manières devraient faire le tour que vous demandez.
la source
Le moyen le plus simple est d’émettre le
QUIT
signal, qui est généralement associé àControl-Backslash
.Quand vous voyez le train, appuyez sur Control- \
la source
Vous pouvez
kill
lepid
de shell (bash).Je viens d'essayer et ça marche.
Parce que je ne peux pas voir le processus
ps -ef
(le travail que nous exécutons dans le script en boucle).la source
Une autre façon de terminer le script entier consiste à mettre en arrière-plan la
sl
commande, puis à intercepter le signalINT
afin de tuer le groupe de processus entier du script avec signalHUP
.la source
utiliser
set -e
pour sortir de l'échec.la source
sl
ne meurt pas avec ctrl + c.cela devrait aider.
la source
Le meurtre est affreux, parce que vous ne devez plus jamais si le script doit être exécuté deux fois. ET votre code de sortie est faux.
Ne pas travailler. Solution = utilisez perl. en ouvrant sa propre bash
la source