Priročnik za ukaze Kill, Pkill in Killall za zaključek procesa v Linuxu


Operacijski sistem Linux ima ukaz kill za zaključek procesa. Ukaz omogoča nadaljevanje zagona strežnika, ne da bi ga bilo treba po večji spremembi/posodobitvi ponovno zagnati. Tu prihaja velika moč Linuxa in to je eden od razlogov, zakaj Linux deluje na 90% strežnikov na planetu.

Ukaz Kill pošlje signal, določen signal, ki je bolj popoln za postopek. Ukaz kill se lahko izvede na več načinov, neposredno ali iz skripta lupine.

Uporaba ukaza kill iz/usr/bin vam nudi nekaj dodatnih funkcij za ubijanje procesa po imenu procesa s pomočjo pkill.

Pogosta sintaksa za ukaz kill je:

# kill [signal or option] PID(s)

Za ukaz kill je lahko ime signala:

Signal Name		Signal Value			Behaviour

SIGHUP			      1				Hangup
SIGKILL			      9				Kill Signal
SIGTERM			      15			Terminate

Iz vedenja zgoraj je SIGTERM očitno privzeti in najvarnejši način za uničenje procesa. SIGHUP je manj varen način ubijanja postopka kot SIGTERM. SIGKILL je najbolj nevaren način med zgornjimi tremi, da ubije postopek, ki zaključi postopek brez shranjevanja.

Da bi postopek ubili, moramo poznati ID procesa. Proces je primerek programa. Vsakič, ko se program zažene, se samodejno ustvari edinstveni PID za ta postopek.

Vsak proces v Linuxu ima pid. Prvi postopek, ki se začne ob zagonu sistema Linux, je postopek init, zato mu je v večini primerov dodeljena vrednost "1".

Init je glavni postopek in ga ni mogoče ubiti na ta način, kar zagotavlja, da se glavni postopek ne zgodi po naključju. Init se odloči in se pusti ubiti, pri čemer je ubijanje zgolj prošnja za zaustavitev.

Če želite poznati vse procese in jim dodeliti pid, zaženite naslednji ukaz ps.

# ps -A
PID TTY          TIME CMD
    1 ?        00:00:01 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 migration/0
    4 ?        00:00:00 ksoftirqd/0
    5 ?        00:00:00 migration/0
    6 ?        00:00:00 watchdog/0
    7 ?        00:00:01 events/0
    8 ?        00:00:00 cgroup
    9 ?        00:00:00 khelper
   10 ?        00:00:00 netns
   11 ?        00:00:00 async/mgr
   12 ?        00:00:00 pm
   13 ?        00:00:00 sync_supers
   14 ?        00:00:00 bdi-default
   15 ?        00:00:00 kintegrityd/0
   16 ?        00:00:00 kblockd/0
   17 ?        00:00:00 kacpid
   18 ?        00:00:00 kacpi_notify
   19 ?        00:00:00 kacpi_hotplug
   20 ?        00:00:00 ata/0
   21 ?        00:00:00 ata_aux
   22 ?        00:00:00 ksuspend_usbd

Kaj pa prilagodite zgornji izhod z uporabo sintakse kot "pidof proces".

# pidof mysqld
1684

Drug način za dosego zgornjega cilja je upoštevanje spodnje skladnje.

# ps aux | grep mysqld
root      1582  0.0  0.0   5116  1408 ?        S    09:49   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     1684  0.1  0.5 136884 21844 ?        Sl   09:49   1:09 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root     20844  0.0  0.0   4356   740 pts/0    S+   21:39   0:00 grep mysqld

Preden stopimo naprej in izvršimo ukaz kill, je treba opozoriti na nekaj pomembnih točk:

  1. Uporabnik lahko ubije ves svoj postopek.
  2. Uporabnik ne more ubiti postopka drugega uporabnika.
  3. Uporabnik ne more ubiti procesov, ki jih uporablja sistem.
  4. Korenski uporabnik lahko ubije proces na ravni sistema in postopek katerega koli uporabnika.

Drug način za izvajanje iste funkcije je izvajanje ukaza 'pgrep'.

# pgrep mysql
3139

Če želite ubiti zgornji PID procesa, uporabite ukaz kill, kot je prikazano.

kill -9 3139

Zgornji ukaz bo ubil postopek s pid = 3139, kjer je PID številčna vrednost procesa.

Drug način za izvajanje iste funkcije je mogoče prepisati kot.

# kill -SIGTERM 3139

Podobno je "kill -9 PID" podoben "kill -SIGKILL PID" in obratno.

Zavedati se morate imena procesa, preden vas lahko ubije in vnese napačno ime procesa.

# pkill mysqld

Ubijte več kot en postopek hkrati.

# kill PID1 PID2 PID3

or

# kill -9 PID1 PID2 PID3

or

# kill -SIGKILL PID1 PID2 PID3

Kaj pa, če ima postopek preveč primerkov in številne podrejene procese, imamo ukaz 'killall'. To je edini ukaz te družine, ki kot argument namesto številke procesa vzame ime procesa.

# killall [signal or option] Process Name

Če želite ubiti vse primerke mysql in podrejene procese, uporabite ukaz, kot sledi.

# killall mysqld

Stanje procesa lahko vedno preverite s pomočjo katerega koli od spodnjih ukazov.

# service mysql status
# pgrep mysql
# ps -aux | grep mysql

To je za zdaj vse, z moje strani. Kmalu bom spet tukaj z drugo Zanimivo in informativno temo. Do takrat bodite z nami, povezani s Tecmintom in zdravi. Ne pozabite dati dragocenih povratnih informacij v oddelku za komentarje.