it-swarm-eu.dev

Jak zastavit smyčkový bash skript v terminálu?

Například,

#!/bin/bash
while :
do
    sl
done

Jak ukončit tento bash skript?

58
Yinyanghu

Program sl záměrně ignoruje SIGINT, což je to, co bude odesláno po stisknutí Ctrl+C. Nejprve tedy musíte říct, že sl nebude ignorovat SIGINT přidáním argumentu -e.

Pokud to zkusíte, všimnete si, že můžete zastavit každého jednotlivce sl, ale stále se opakují. Musíte také říct bash, aby ukončil i po SIGINT. Můžete to provést vložením trap "exit" INT Před smyčku.

#!/bin/bash
trap "exit" INT
while :
do
    sl -e
done
72
Jim Paris
  1. lis Ctrl-Z pozastavení skriptu
  2. kill %%

The %% řekne vestavěné bash kill, že chcete poslat signál (ve výchozím nastavení SIGTERM) do naposledy pozastavené úlohy na pozadí v aktuálním prostředí, nikoli do ID procesu.

Můžete také určit úlohy podle čísla nebo názvu. např. když pozastavíte úlohu pomocí ^ Z, bash vám řekne, jaké je číslo její úlohy, například [n]+ Stopped, kde n uvnitř hranatých závorek je číslo úlohy.

Chcete-li získat další informace o řízení úlohy a zabíjení úloh, spusťte help jobs, help fg, help bg, a help kill v bash a hledejte JOB CONTROL (všechna velká písmena) nebo jobspec na stránce bash man.

např.

 $ ./killme.sh 
 ./ killme.sh: řádek 4: sl: příkaz nebyl nalezen 
 ./ killme.sh: řádek 4: sl: příkaz nebyl nalezen 
 ./ killme.sh: řádek 4: sl: příkaz nebyl nalezen 
 ./ killme.sh: řádek 4: sl: příkaz nebyl nalezen 
 ./ killme.sh: řádek 4 : sl: příkaz nenalezen 
 ... 
 ... 
 ... 
 ./ killme.sh: řádek 4: sl: příkaz nebyl nalezen 
 ^ Z 
 [1] + Zastaveno ./killme.sh
$ kill kill %% 
 $ 
 [1] + Ukončeno ./killme. sh 

V tomto příkladu bylo číslo úlohy 1, takže kill %1 by fungovalo stejně jako kill %%

(POZNÁMKA: Nemám nainstalován program sl, takže výstup je pouze „příkaz nenalezen“. Ve vašem případě dostanete cokoli, co produkuje sl. Není to důležité - ^Z pozastavit a kill %% bude fungovat stejně)

128
cas

Pokud chcete, aby ctrl + c zastavila smyčku, ale skript neskončil, můžete umístit || break po každém spuštěném příkazu. Dokud program, který běží, skončí na ctrl + c, funguje to skvěle.

#!/bin/bash
while :
do
    # ctrl+c terminates sl, but not the Shell script
    sl -e || break
done

Pokud jste v vnořené smyčce, můžete použít "break 2" a dostat se ze dvou úrovní, atd.

7
Dale Anderson

Nejjednodušší způsob je vydat signál QUIT, který je obvykle připojen k Control-Backslash.

Když uvidíte vlak, stiskněte Control- \

4
RobertL

Tento skript můžete ukončit stisknutím kláves Ctrl + C z terminálu, kde jste tento skript spustili. Tento skript musí samozřejmě běžet v popředí, abyste ho mohli zastavit pomocí Ctrl + C.

Nebo najdete PID (Process ID) tohoto skriptu v jiném otevřeném terminálu podle:

ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>

Oba způsoby by měly udělat trik, o který žádáte.

4
panaroik

Můžete killpid Shell (bash).
Jen jsem to zkusil a funguje to.
Protože nevidím proces od ps -ef (úloha, kterou spustíme ve smyčkovém skriptu).

1
Suwarto

Dalším způsobem, jak ukončit celý skript, by bylo pozadí příkazu sl a potom zachycení signálu INT k zabití celé procesní skupiny skriptu signálem HUP.

#!/bin/bash

trap 'trap - INT; kill -s HUP -- -$$' INT
#trap 'trap - INT; kill -s HUP 0' INT

while :
do
   sl & wait
done
0
chanze