GNU/Linux >> Znalost Linux >  >> Linux

Killall Command v Linuxu s příklady

Příkazový řádek Linuxu nabízí různé příkazy k ukončení procesu. Například příkaz 'kill' lze použít k ukončení procesu předáním jeho PID jako argumentu, příkaz 'pkill' vezme vzor jako vstup a všechny odpovídající běžící procesy jsou zabity. Existuje však příkaz 'killall', který ve výchozím nastavení přesně odpovídá názvu argumentu a ukončí proces porovnávání.

V tomto článku si tento příkaz probereme na několika praktických příkladech. Příkaz killall lze použít k odeslání signálu konkrétnímu procesu pomocí jeho názvu. To znamená, že pokud máte spuštěno pět verzí stejného programu, příkaz killall zabije všech pět.

Signál lze zadat jako argument tohoto příkazu nebo jinak SIGTERM je standardně odesláno. Proces může generovat podřízené procesy, které jsou nezávislé na rodičovském procesu, to znamená, že každý podproces se identifikuje pomocí svého pid. U příkazu kill používáme pid k výběru podprocesu, který se má zabít, ale u příkazu killall uvedením názvu, protože všechny podprocesy a rodič procesu mají stejný název, budou všechny procesy zabity.

Pojďme diskutovat o použití příkazu killall prostřednictvím několika praktických příkladů.

1) Seznam všech podporovaných signálů

Příkaz Kill podporuje některé signály, které mohou být uvedeny pomocí -l volba. killall vysílá signály procesům. Můžete použít -s možnost (následuje názvem signálu) pro odeslání konkrétního signálu procesu.

$ killall -l
 HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
 STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
 UNUSED

Ve výchozím nastavení SIGTERM/TERM (15) je odeslán ke zpracování, pokud ne, je dán signál příkazu killall. Výše uvedené signály jsou užitečné jak uživateli, tak správci systému. Takže killall podporuje všechny tyto signály.

2) Zabijte konkrétní proces

Abychom proces zabili, musíme jej identifikovat a zkontrolovat, zda běží. Můžeme zabít konkrétní proces jeho jménem. Předpokládejme, že existují dva procesy, které mají stejné počáteční znaky:

$ ps -aef | grep "test"
 himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
 himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again

Zde je návod, jak můžete použít příkaz killall k zabití 'test_again':

$ killall test_again
 [2]+ Terminated ./test_again

Jak můžete vidět, příkaz killall ukončil proces 'test_again'. To lze také potvrdit pomocí příkazu ps :

$ ps -aef | grep "test"
 himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test

Všimněte si, že 'test_again' není zobrazeno ve výstupu, protože je zabito.

3) Zabijte proces ignorováním případu

Příkaz killall ve výchozím nastavení rozlišuje velká a malá písmena. Zde je příklad:

$ ps -aef | grep "test"
 himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test
 himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again
 himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test

můžete vidět, že všechny naše procesy jsou psány malými písmeny. zkusme zabít proces "./test", ale jméno zadáme velkými písmeny

$ killall TEST
 TEST: no process found

Můžete tedy vidět, že příkaz killall nemohl najít žádný proces s názvem TEST, zatímco proces s názvem „test“ již běží. Chcete-li se ujistit, že příkaz killall ignoruje velká a malá písmena, použijte -I volba. Zde je příklad:

$ killall -I TEST
 [1]- Terminated ./test

Všimněte si, že nyní úspěšně ukončil „testovací“ proces.

4) Ukončení procesů s potvrzením

Příkaz killall lze použít k ukončení více než k procesu.

$ killall test test_again
 [2]- Terminated ./test_again
 [3]+ Terminated ./test

Může se však stát, že uděláte chybu při vkládání názvu procesu uvedením jiného názvu. Pokud je indikovaný proces pro systém kritickým procesem, může to být vážný problém. Proto se doporučuje použít killall k interaktivnímu ukončení procesů žádostí o potvrzení. Chcete-li to provést, můžete použít -i možnost.

$ killall -i test test_again
 Kill test(4201) ? (y/N) y
 Kill test_again(4202) ? (y/N) y
 [1]- Terminated ./test
 [2]+ Terminated ./test_again

Takže můžete vidět, že tímto způsobem může uživatel ovládat ukončení procesů pomocí příkazu killall.

5) Tiše ukončete proces

Někdy, když killall není schopen najít zadaný proces, stěžuje si na to samé ve výstupu.

Zde je příklad:

$ killall TEST
 TEST: no process found

Ale v případě, že chcete, aby killall vykonával svou práci tiše, můžete použít -q možnost:

$ killall -q TEST
$

Takže můžete vidět, že když bylo použito -q, výstup byl potlačen.

6) Podivný výsledek příkazu killall

Manuálová stránka příkazu killall říká, že ve výchozím nastavení odpovídá úplným jménům pouze tehdy, pokud jsou kratší nebo rovna 15 znakům. Pokud je tedy název příkazu delší než 15 znaků, může být celý název nedostupný (tj. je zaměněn). V tomto případě zabijte zabije vše, co odpovídá v prvních 15 znacích.

Předpokládejme například, že existují následující dva procesy s dlouhými názvy:

$ ps -aef | grep "test"
 himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij
 himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh

První proces ve výše uvedeném výstupu má přesně 15 znaků v názvu. Zkusme to zabít pomocí příkazu killall :

$ killall test_abcdefghij
 [1]- Terminated ./test_abcdefghij

Takže můžete vidět, že příkaz killall proces úspěšně ukončí.

Nyní, podle manuálové stránky, pokud by obě jména měla více než 15 odpovídajících znaků, killall by zabil procesy, kde za jménem následuje -e nebo to zabije vše, co odpovídá v prvních 15 znacích. Zde je příklad:

$ ps -aef | grep "test"
 himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
 himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz
 himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test

Všimněte si, že oba procesy mají nyní ve svém názvu více než 15 odpovídajících znaků. Nyní, když jsem se pokusil zabít druhý proces pomocí killall :

$ killall test_abcdefghijklmnopqrstuvwxyz
 [6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz

Zabil pouze zadaný proces a ne také druhý proces

$ ps -aef | grep "test"
 himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
 himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test

Nejsem si jistý, jestli je na mé straně něco nesprávného, ​​nebo je to chyba v příkazu killall. Ocenil bych, kdybyste své názory na toto uvedli v komentářích.

BTW, zde jsou podrobnosti příkazu killall v mém systému:

$ killall --version
killall (PSmisc) 22.20
Copyright (C) 1993-2012 Werner Almesberger and Craig Small

PSmisc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under
the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.

Závěr

Od Centos 7 doporučuje spouštět pkill místo killall, takže ve výchozím nastavení se vám při spuštění příkazu může zobrazit chyba ''killall:command not found. psmisc).

Killall je užitečný, protože můžeme zabít proces jeho jménem, ​​i když si nepamatujeme jeho pid. Nemá žádné možnosti, protože je relativně jednoduchý na používání.

Přečtěte si také:

  • Jak zabít proces z terminálu Linux
  • fkill – Interaktivní nástroj pro zabíjení procesů v Linuxu

Linux
  1. Linux Tee Command s příklady

  2. Příkaz linuxové hlavy s příklady

  3. JQ Command v Linuxu s příklady

  1. wc Linux Command s příklady

  2. Linux řazení příkazů s příklady

  3. Příklady příkazů killall v Linuxu

  1. Echo Command v Linuxu (s příklady)

  2. man Command v Linuxu s příklady

  3. Příkaz AWK v Linuxu s příklady