Linux’ta kill komutları nasıl kullanılır?
Her ne kadar Linux, uygulamalarla ilgili çok az sorunu olan sağlam bir işletim sistemi olarak görülse de, programlar bazen yanıt vermeyebilir. Bu gerçekleştiğinde, çok fazla sistem kaynağı tüketebilir veya tüm sistemi çökertebilirler. Genellikle bu uygulamalar otomatik olarak yeniden başlatılamaz.
İşlem veya uygulama hala çalışıyorsa ve tamamen kapatılmayacaksa, Linux’ta işlemi sonlandırmak için bir komut kullanmanız gerekir. Bu durumda ya tüm sistemi yeniden başlatmak ya da belirli bir başvuru sürecini sonlandırmak gerekir. Tüm sistemin yeniden başlatılması zaman aldığından ve istemciler için ciddi rahatsızlık yaratabildiğinden, Linux’ta bir işlemi sonlandırmak çok daha kolaydır .
Süreçleri ve süreç kimliklerini (PID’ler) anlama
Süreç, halihazırda yürütülmekte olan bir programın çalışma mekanizmasıdır. Oluşturulduktan sonra her işleme otomatik olarak benzersiz bir süreç kimlik numarası ( PID ) atanır. Bir süreç öldüğünde PID’si kullanılabilir bir havuza geri döner ve başka bir süreç onu yeniden kullanabilir.
Belirli bir PID’yi bulmak için sunucuda birden fazla komut kullanabiliriz . Örneğin, bize çalışan tüm süreçlerin bir tablosunu verecek olan top komutunu kullanabiliriz . Bununla, bir sürecin PID’sini diğer faydalı sistem bilgileriyle birlikte bulabiliriz .
PID’yi bulmanın başka bir yolu da ps komutunu kullanmaktır . Aşağıda, PID’yi bulmak için ps komutunu kullanmanın birkaç farklı yolunu görüyoruz :
[root@sunucucozumleri ~]# ps faux | grep systemd
Root 1 0.0 0.6 96656 11260 ? Ss Jan24 0:08 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
Root 533 0.0 1.3 125588 22832 ? Ss Jan24 0:25 /usr/lib/systemd/systemd-journald
Root 564 0.0 0.5 107440 9248 ? Ss Jan24 0:00 /usr/lib/systemd/systemd-udevd
Dbus 684 0.0 0.3 73540 5524 ? Ss Jan24 0:06 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
Root 743 0.0 0.4 95736 7760 ? Ss Jan24 0:01 /usr/lib/systemd/systemd-logind
Root 66199 0.0 0.0 12108 1060 pts/0 S+ 08:28 0:00 \_ grep --color=auto systemd
Root 66153 0.0 0.5 93212 9472 ? Ss 08:27 0:00 /usr/lib/systemd/systemd --user
[root@host ~]#
[root@host ~]# ps -eo user,pid,command | grep systemd
[root@host ~]# ps -eo user,pid,command | grep systemd
root 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root 533 /usr/lib/systemd/systemd-journald
root 564 /usr/lib/systemd/systemd-udevd
dbus 684 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 743 /usr/lib/systemd/systemd-logind
root 66153 /usr/lib/systemd/systemd --user
root 66213 grep --color=auto systemd
[root@sunucucozumleri ~]#
Bu işlemin karşılık gelen PID’lerini bulmak için pidof işlem_adı ve pgrep işlem_adı komutlarını da kullanabiliriz :
[root@sunucucozumleri ~]# pidof systemd
66156 66153 1
[root@host ~]#
[root@sunucucozumleri ~]# pgrep systemd
1
533
564
743
66153
[root@sunucucozumleri ~]#
Linux’ta bir işlemi sonlandırmak için kill komutunu kullanabiliriz. Belirtilen bir işleme sinyal gönderen yerleşik bir komuttur. Linux işletim sistemi söz konusu işlemi durduracaktır.
Öldürme sinyallerine genel bakış
Sinyaller, diğer süreçlerden, çekirdekten veya belirli bir sürecin kendisinden gelen süreçler arasında bir diyalog biçimidir. Her sürecin, beş türü olan güncel bir davranışı veya eğilimi vardır:
Terim
Ateşle
Çekirdek
Durmak
devam
Bu özellikler, kendisine bir sinyal iletildiğinde sürecin nasıl davranacağını belirler. Terimin varsayılan eylemi , öncelikle kill komutu tarafından kullanılan işlemi sonlandırmaktır .
Kill komutuyla birlikte kullanılan toplam 64 sinyal vardır . Farklı sinyallerin farklı etkileri ve sonuçları olduğundan, göndereceğimiz sinyal istenen sonuca bağlı olacaktır. Bu 64 sinyalden ilk 31’i standart sinyallerdir. Gerisi gerçek zamanlı sinyallerdir.
İki sinyal türü arasındaki temel fark, standart sinyallerin kuyruğa alınamaması, ancak gerçek zamanlı sinyallerin kuyruğa alınabilmesidir. Bunun anlamı, standart bir sinyalin ilk örneğiyle ilişkili bilginin bir süreç tarafından alınmasıdır. Gerçek zamanlı sinyaller, kendisiyle ilişkili bilgileri sıraya koyarak birden fazla sinyalin alınmasına olanak tanır.
Mevcut sinyallerin tam listesini kill -l komutuyla veya sinyal kılavuzu sayfasında man 7 signal komutunu girerek görebiliriz :
[root@sunucucozumleri ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT
7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
[root@sunucucozumleri ~]#
Bu sinyallerin çoğu için program farklı bir eylem belirtebilir veya belirtmeyebilir. Program eylemi tanımlıyorsa buna sinyali yakalamak veya işlemek denir. Herhangi bir işlem yapılmazsa sinyal dikkate alınmaz.
En sık kullanılan sinyaller aşağıdaki gibidir:
Sinyal Adı Tek değer Etki
SIGHUP 1 Kapat, bir işlemi yeniden yükle
İŞARET 2 Klavyeden kesme
SIGKILL 9 Bir süreci öldür
TERİM 15 Bir süreci zarif bir şekilde sonlandırın
SIGSTOP 17, 19, 23 Bir işlemi durdurma
SIGKILL ve SIGSTOP sinyalleri yakalanamaz, engellenemez veya göz ardı edilemez; SIGTERM sinyali ise yakalanabilir veya göz ardı edilebilir. Bu nedenle Linux’ta SIGTERM işlemi durduramadığında veya sonlandıramadığında SIGKILL’i kullanabiliriz .
Aşağıdaki örnekte kill -15 (SIGTERM) komutu Java işlemini durdurmamaktadır. Bu nedenle, bu gibi durumlarda Linux’un süreçleri sonlandırmaya zorlaması gerekir:
[root@sunucucozumleri ~]# ps -eo user,pid,command | grep java
tomcat 59815 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat9 -Djava.io.tmpdir=/usr/local/tomcat9/temp org.apache.catalina.startup.Bootstrap start
root 66401 grep --color=auto java
[root@sunucucozumleri ~]# kill -15 59815
[root@sunucucozumleri ~]#
Linux kill komutunu kullanma
Genel kurallar
Linux’ta bir işlemi durdurmanın başka genel kuralları da vardır. Normal kullanıcıların kendi süreçlerine sinyal gönderebildiklerini ancak diğer kullanıcılara ait süreçlere sinyal gönderemediklerini unutmamak önemlidir. Kök kullanıcı ise diğer tüm kullanıcıların işlemlerine sinyal gönderebilir. İşte bazı ek genel kurallar:
Gönderilen sinyaller , komuta hangi PID’yi ilettiğimize bağlıdır .
PID sıfırdan büyükse sinyal o PID ile işleme gönderilir .
PID sıfıra eşitse sinyal, kill komutunda yer alan kabuğun işlem grubundaki ( PGID ) tüm işlemlere gönderilir .
PID -1’e eşitse , sinyal tüm işlemlere kill komutunu çağıran kullanıcıyla aynı kullanıcı kimliğiyle gönderilir .
PID -1’den küçükse , işlem grubu kimliği PID’nin mutlak değerine eşit olacak şekilde işlem grubundaki tüm işlemlere sinyal gönderilir .
Linux kill komutunun sözdizimi ve temel kullanımı
Kill komutu Linux’ta bir işlemi sonlandırmak için bir sinyal gönderir. Varsayılan olarak başka bir sinyal tanımlanmadıysa TERM sinyali gönderir . Bu sinyal, Linux işletim sisteminde süreci zarif bir şekilde durdurmaya çalışacaktır.
Bu başarısız olursa, işlemi başka bir sinyalle sonlandırmayı deneyin çünkü sinyal yakalanmış veya göz ardı edilmiş olabilir. Linux’ta bir işlemi , bir sayı kullanarak ( kill -9 ), SIG önekiyle ( kill -SIGkil l ) veya SIG öneki olmadan ( kill -kill ) tanımlayarak farklı bir sinyalle öldürürsünüz .
Gördüğünüz gibi kill -9 (SIGKILL) komutu Java işlemini sonlandırdı:
[root@sunucucozumleri ~]# ps -eo user,pid,command | grep java
tomcat 66469 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat9 -Djava.io.tmpdir=/usr/local/tomcat9/temp org.apache.catalina.startup.Bootstrap start
root 66516 grep --color=auto java
[root@sunucucozumleri ~]# kill -9 66469
[root@sunucucozumleri ~]#
[root@sunucucozumleri ~]# ps -eo user,pid,command | grep java
root 66530 grep --color=auto java
[root@sunucucozumleri ~]#
Kill komutunu aşağıdaki sözdizimiyle çağırın.
kill [OPTIONS] [PID]
Örneğin, bir httpd işleminin işlem kimliğinin 21567 olduğunu bulursak , aşağıdaki komutu çağırarak onu zarif bir şekilde sonlandırmayı deneyebiliriz . TERM sinyalini gönderecektir :
[root@sunucucozumleri ~]# kill 21567
Eğer bu süreci durdurmazsa, SIGKILL sinyaliyle onu öldürmeyi deneyebiliriz , bu da işlemin düzgün bir şekilde kapatılmasını beklemeden onu sonlandıracaktır . Bunu yapmak için aşağıdaki komutlardan birini kullanırsınız:
[root@sunucucozumleri ~]# kill -9 21567
[root@sunucucozumleri ~]# kill -SIGKILL 21567
[root@sunucucozumleri ~]# kill -kill 21567