Například,
#!/bin/bash
while :
do
sl
done
Jak ukončit tento bash skript?
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
Ctrl-Z
pozastavení skriptukill %%
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ě)
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.
Nejjednodušší způsob je vydat signál QUIT
, který je obvykle připojen k Control-Backslash
.
Když uvidíte vlak, stiskněte Control- \
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.
Můžete kill
pid
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).
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