Linux'ta süreç yönetimi. Linux Ubuntu öldürme işlemi pid ile nasıl sonlandırılır

Bugün Ubuntu Linux'ta takılıp kalmış ve onları sonlandıramayacağınız süreçlerle nasıl başa çıkılacağı hakkında konuşacağız. Sistemi yükleyerek sistem kaynaklarını tüketirler, RAM'in iyi bir kısmını yutarlar, bu da bilgisayarda yavaşlama veya kısa süreli kısmi sistem donmaları gibi sorunlar yaratır. Durumlar farklı, bazen masaüstü donuyor, bazen uygulama donuyor, bazen masaüstü ortamı donuyor, bu durumlardan sistemi yeniden başlatmadan nasıl yapacağımızın bir yolunu arayacağız ve bilgisayarı düğme ile kapatmayacağız. Bu iyi bir çözüm olmadığı için bilgisayarın sistem biriminde.

Bazen Ubuntu Linux'ta bir işlemi öldürmeye ihtiyaç duyulur, nasıl doğru yapılır ve zarar vermez, hem konsol çözümlerini hem de grafiksel bir arayüz üzerinden tartışacağız.

Bugün Ubuntu Linux'ta takılıp kalmış ve onları sonlandıramayacağınız süreçlerle nasıl başa çıkılacağı hakkında konuşacağız. Sistemi yükleyerek sistem kaynaklarını tüketirler, RAM'in iyi bir kısmını yutarlar, bu da bilgisayarda yavaşlama veya kısa süreli kısmi sistem donmaları gibi sorunlar yaratır. Durumlar farklı, bazen masaüstü donuyor, bazen uygulama donuyor, bazen masaüstü ortamı donuyor, bu durumlardan bir çıkış yolu arayacağız, sistemi yeniden başlatmadan nasıl yapılır ve düğme ile bilgisayarı kapatmaz Bu iyi bir çözüm olmadığı için bilgisayarın sistem biriminde.

Ubuntu Linux ile çalışırken muhtemelen zaten sorularınız var:

İşlemi / uygulamayı daha sonra sonlandırmak için PID nasıl belirlenir?

Komutu çalıştırmak istemiyorsanız tepe veya başka bir daha güçlü analog htop, sonra bunun veya bu işlem kimliğinin kimliğini aramaya zahmet edin, bulmanın daha kolay bir yolu/çözüm var PID işlemi, " komutunu kullanabilirsiniz. pidof" veya " PS".

Diyelim ki Google Chrome uygulamasının işlem kimliğini bulmamız gerekiyor, bu durumda ne yapıyoruz, Ctrl + Alt + T terminalini açıp terminalde komutu yürütün:

pidof krom

çıktıyı alıyoruz:

9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

neredeyse hazır, süreci nasıl sonlandıracağımızla ilgili PID'yi belirledik, aşağıda okuyun.

PID ile Linux'ta bir süreç nasıl öldürülür

Uygulamada hangi PID'yi öldürmek istediğimizi belirledik, yukarıdan, tarayıcıda çalışan birçok sekmem olduğunu ve ayrıca ayrı tarayıcı işlemlerinin, sonuç olarak hepsini öldürmek için 16 kimlik olduğunu görebilirsiniz. emretmek:

Sudo öldür 9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

Ayrıca aşağıdaki komutu çalıştırarak sistemdeki tüm aktif işlemleri görebilirsiniz:

sudo ps aksu

evet, bu kadar basit. Chrome yerine başka bir uygulama, skype veya başka bir uygulama olabilir.

Ayrıca, sonlandırmak istediğiniz uygulamanın işlem kimliğini bulmak için ek bir komut da kullanabilirsiniz:

Ps-A | grep -i isim uygulaması

name-app yerine uygulamanın adını yazıyoruz, tam adı manuel olarak girmiyoruz, tuşlarını kullanarak otomatik algılamayı kullanıyoruz " SEKME". Sonuç olarak, bu komut gerekli işlemin çalışma süresini ve buna bağlı olarak PIDöldürmek için kullanabileceğiniz , terminalde çalıştırma komutunu kontrol edelim:

Ps-A | grep -i skype

aşağıdaki sonucu elde ederiz:

9257? skype 00:00:57

tek ihtiyacımız olan bir bakışta, bir kimlik var, bu işlemin ne kadar süredir devam ettiğini de görüyoruz.

Linux'ta Kill Komutu Nasıl Kullanılır

Yukarıda PID tanımlayıcısının nasıl alınacağını zaten anlattım, o zaman bu PID'yi kill ile birlikte kullanmamız gerekiyor, beğenmediğimiz işlemi öldüreceğiz, ayrıntılara biraz daha aşağıdan bakın.

Kimlik alındı ​​ve şimdi uygulamayı sonlandırabiliriz:

Sudo öldür 9257

işte bu, uygulama öldü.

Linux'ta bir süreç adıyla nasıl öldürülür

Bir işlemi adıyla öldürmek için killall komutunu kullanabilirsiniz, önce bu komutun aynı ada sahip tüm işlemleri öldürdüğünü anlamalısınız. Bu çok uygundur, çünkü bu durumda ihtiyacımız olan işlemin PID'sini aramamıza gerek yoktur, örneğin Skype uygulamasını kapatmak istiyoruz, komutu terminalde uygulayacağız:

sudo killall skype

aynı seçenek:

sudo killall -s 9 skype

Aynı anda uygulama çalışmayı durdurur, böylece istenmeyen işlemleri kolayca sonlandırabilirsiniz.

Terminalde yürütmemeniz gereken ölüm komutu

Daha önce, sistemi öldürmemek için terminalde hangi komutların çalıştırılmaması gerektiği konusunda kötü tavsiyeler hakkında bir materyal yazmıştım, ancak liste mükemmel değil ve bir tanesini aşağıda bulacağınız daha birçok komutla desteklenebilir.

İşte bir ölüm komutu örneği:

Sudo öldür -9 -1

bu komut, şu anda çalışan tüm işlemleri öldürür. Sonuçları tahmin edilemez olabileceğinden ve büyük olasılıkla sistemi grafiksel bir arayüz olmadan yeniden başlatmanız gerekeceğinden, bunu gerçekleştirmenizi tavsiye etmem. Grafik arayüzü aniden başarısız olursa, komutları kullanarak terminali açın. CTRL+ALT+F1, her yeni pencere aynı benzetmeyle açılır, sadece F1'i F2'ye değiştirir vb.

Ayrıca, komutları çalıştırarak terminal üzerinden yukarıda kullanılan komutlar hakkında yardım alabilirsiniz:

Adam ps adam grep adam pidof adam öldür adamı öldür

Bu, kısa materyalimizi sonlandırıyor, sizin için net olmayan bir şey varsa, aşağıdaki materyalin yorumlarını sorun.


Bu yazıda, Linux işletim sisteminde halihazırda çalışan bir işlemin PID'sini değiştirebilecek bir çekirdek modülü oluşturmaya ve ayrıca değiştirilmiş bir PID alan işlemlerle denemeler yapmaya çalışacağız.


Uyarı: PID'yi değiştirmek standart olmayan bir işlemdir ve belirli koşullar altında bir çekirdek paniğine yol açabilir.

Test modülümüz, okuma işleminin PID'sini değiştirecek olan /dev/test karakter cihazını uygulayacaktır. Bir karakter cihazının uygulanmasına bir örnek için bu makale sayesinde. Modülün tam kodu makalenin sonunda verilmiştir. Elbette en doğru çözüm, çekirdeğe bir sistem çağrısı eklemekti, ancak bu, çekirdeğin yeniden derlenmesini gerektiriyordu.

Çevre

Tüm modül test eylemleri, 64 bit LInux dağıtımı ve çekirdek sürümü 4.14.4-1 olan bir VirtualBox sanal makinesinde gerçekleştirildi. Makine ile iletişim SSH kullanılarak gerçekleştirildi.

1 numaralı basit çözümü deneyin

Mevcut hakkında birkaç kelime: mevcut değişken, çekirdekteki (PID, UID, GID, cmdline, ad alanları, vb.)

İlk fikir, current->pid parametresini çekirdek modülünden istenene değiştirmekti.

Statik ssize_t device_read(struct dosyası *filp, char *buffer, size_t uzunluğu, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",current->pid); , )
Modülün işlevselliğini test etmek için C++ ile bir program yazdım:

#Dahil etmek #Dahil etmek #Dahil etmek int ana() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; standart::çık<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Modülü insmod komutuyla yükleyin, /dev/test oluşturun ve deneyin.

# ./a.out Ebeveynim PID 293 Benim PID 782'm Yeni PID 782'm
PID değişmedi. Belki de PID'nin belirtildiği tek yer burası değildir.

#2 ek PID alanı denemesi

current->pid bir işlem kimliği değilse, nedir? getpid() koduna hızlı bir bakış, Linux sürecini ve çekirdek kaynak kodundaki pid.c dosyasını açıklayan task_struct yapısını gösterir. Gerekli işlev __task_pid_nr_ns'dir. Fonksiyon kodunda görev-> pids.pid çağrısı var, bu parametreyi değiştireceğiz

Derleme ve deneme

SSH ile test ettiğim için, çekirdek çökmeden önce programın çıktısını alabildim:

Ebeveynim PID 293 PID'im 1689 Yeni PID'm 1689
İlk sonuç, zaten bir şey. Ancak PID hala değişmedi.

3. deneme dışa aktarılmamış çekirdek sembolleri

pid.c'ye daha yakından bakmak, ihtiyacımız olanı yapan bir işlev verdi.
static void __change_pid(struct task_struct *görev, enum pid_type türü,
struct pid *yeni)
İşlev, PID'yi, PID türünü ve aslında yeni PID'yi değiştirmenin gerekli olduğu bir görevi kabul eder. Yeni bir PID'nin oluşturulması, işlev tarafından gerçekleştirilir.
struct pid *alloc_pid(struct pid_namespace *ns)

Bu işlev yalnızca yeni PID'nin içinde olacağı ad alanını kabul eder, bu alan task_active_pid_ns kullanılarak elde edilebilir.
Ancak bir sorun var: bu çekirdek sembolleri, çekirdek tarafından dışa aktarılmaz ve modüllerde kullanılamaz. Harika bu sorunu çözmemde bana yardımcı oldu. find_sym fonksiyon kodu oradan alınır.

Statik asmlinkage void (*change_pidR)(struct task_struct *görev, enum pid_type türü, struct pid *pid); statik bağlantı yapısı pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST sürücüsü yüklendi!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) static ssize_t device_read(struct file * filp, char *buffer, size_t uzunluk, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(geçerli) ,PIDTYPE_PID,newpid); printk("yeni PID: %d.\n",current->pid); ... )
Derleyin, çalıştırın

Ebeveynim PID 299 PID 750'm Yeni PID 751'im
PID değişti! Çekirdek, programımıza otomatik olarak ücretsiz bir PID tahsis etti. Ancak, PID 1 gibi başka bir işlemin işgal ettiği bir PID kullanmak mümkün müdür? Tahsisten sonra kod ekleyin

Newpid->numbers.nr = 1;
Derleyin, çalıştırın

Ebeveynim PID 314'üm PID 1172 Yeni PID'm 1
Gerçek PID 1'i alıyoruz!

Bash, %n komutunda görev geçişini engelleyen bir hata atar, ancak diğer tüm işlevler düzgün çalışır.

Değişen PID'li süreçlerin ilginç özellikleri

PID 0: Giriş yapılamıyor

Kodlara geri dönelim ve PID'yi 0 olarak değiştirelim.

Newpid->numbers.nr = 0;
Derleyin, çalıştırın

Ebeveynim PID284'üm PID 1517 Yeni PID'm 0
PID 0'ın çok özel olmadığı ortaya çıktı? Seviniyoruz, çıkış yazıyoruz ve ...

Çekirdek düşüyor! Çekirdek, görevimizi BOŞ GÖREV olarak tanımladı ve tamamlandığını görünce basitçe çöktü. Görünüşe göre programımız sonlandırılmadan önce “normal” PID'ye dönmelidir.

görünmez süreç

Koda geri dönelim ve PID'yi ayarlayalım, garantili meşgul değil
newpid->numbers.nr = 12345;

Derleyin, çalıştırın

Ebeveynim PID296'm PID 735'im Yeni PID'm 12345
Bakalım /proc'ta neler var

1148 19224288 37798693 konsollar fb kcore kilitleri bölüm takasları sürüm 10149 2226294887 acpi cpuinfo dosya sistemleri anahtar-kullanıcılar meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 88 asound kriptolu fs anahtarları misc tetik vmstat 11 16 20889 24 291 6 81 cihazlar kmsg modülleri scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 139 18 22 27 30 76 84 91 cmdline sürücüsü irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat çalışma süresi
Gördüğünüz gibi, ücretsiz bir PID almış olsak bile /proc sürecimizi tanımlamaz. Önceki PID de /proc içinde değil ve bu çok garip. Belki de farklı bir ad alanındayız ve bu nedenle ana /proc tarafından görülmüyoruz. Yeni /proc'u bağlayın ve orada ne olduğunu görün

1 14 18 210 25 291 738 81 9 veri yolu cihazları fs anahtar kullanıcıları kilitleri pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 sched_debug takasları çalışma süresi 11 15 2 224 28 37 78 84 93 config.gz sürücüsü ioports kpagecgroup modülleri schedstat sys sürümü 12 16 20 226 288 4 79 85 acpi konsolları execdomains irq kpagecount mounts scsi sysrq-tetikleyici vmallocinfo 16 6 17 203 cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinkfogs şifre dosyası öz bölge bilgisi
Daha önce olduğu gibi, işlemimiz mevcut değil, yani normal ad alanındayız. Hadi kontrol edelim

Ps-e | grep bash
296 puan/0 00:00:00 bash

Programı başlattığımız yalnızca bir bash. Ne önceki PID ne de mevcut olan listede yok.

Olabildiğince, bazı uygulamalarda linux bazen susarsın. Aynı zamanda, uygulamanın hiç yanıt vermediği veya çok yavaş çalıştığı ve doğru şekilde kapatmanın mümkün olmadığı durumlar vardır. Ortaya çıkan durumdan hızlı bir şekilde çıkmak için bu süreci "öldürebilirsiniz". Bunun için komutlar kullanılır. öldürmek ve hepsini öldür. Şimdi bu komutların nasıl kullanılacağını anlayacağız, işlemin PID'sini bulacağız ve SIGKILL sinyalini göndereceğiz.

Karışıklığı önlemek için, bir süreci sisteme başlatılan bir program olarak anlamayı kabul edeceğiz. Örneğin, çalışan birkaç Mozilla Firefox tarayıcı pencereniz varsa, bu, üç işlemin çalışmakta olduğu anlamına gelir.

Bir işlemin PID'sini bulun - pidof komutu

PID- sistemdeki benzersiz işlem kimliği linux. Bir işlemi doğru bir şekilde durdurmak için önce PID'sini belirlemeniz gerekir. Bunun için ps ve grep komutları kullanılır. Sırasıyla ps komutu sistemdeki aktif süreçlerin bir listesini ve bunlarla ilgili bilgileri görüntülemek için tasarlanmıştır. grep komutu ps (bir boruda) ile aynı anda çalışır ve ps komutunun sonuçlarında arama yapar. Tüm işlemleri aşağıdakileri çalıştırarak listeleyebilirsiniz:

Tabii ki, PID ayrıca şu şekilde de belirlenebilir: tepe. Ancak çoğu durumda, işlem sayısı çok fazladır (ve dinamik olarak üstte değişir), bu nedenle PID'yi hızlı ve doğru bir şekilde belirlemek o kadar kolay değildir. Bu tam olarak grep komutunun kullanıldığı şeydir. Örneğin, Google Chrome tarayıcı işlemini sonlandırmak için aşağıdaki komutu çalıştırmanız gerekir:

ps aksu | grep krom

$ ps eksen | grep krom
itechf2 20474 2,7 1,5 938416 120136 tty2 Sl+ 11:07 0:00 /opt/google/chrome/chrome

Bizim durumumuzda 20474 istenen PID'dir. Daha kolay bir yol, komutu kullanmaktır. pidof ve işlemin adını belirtmeniz gerekir. Örneğin:

$pidofkrom
20728 20706 20668 20647 20586 20574 20553 20508 20474

Linux'ta işlemi sonlandır - öldür ve öldür komutları

İşletim sisteminde işlemi sonlandır linux, PID'sini bilerek, komutu kullanabilirsiniz öldürmek. Bilmeye ve anlamaya değer: kill komutu, sürece bir sinyal göndermeyi amaçlar. Varsayılan olarak hangi sinyalin gönderileceğini belirtmezsek SIGTERM sinyali (sonlandırma - sonlandırma kelimesinden) gönderilir. SIGTERM işlemin sonlandırılmasını söyler. Her sinyalin kendi numarası vardır. SIGTERM 15 numaradır. Kill komutunun gönderebileceği tüm sinyallerin (ve numaralarının) listesi yazarak görüntülenebilir. öldür -l . 2811'i işlemek üzere bir SIGKILL sinyali (9 numaralı) göndermek için şunu çalıştırın:

Aynı zamanda, SIGTERM sinyali işlemi durdurmayabilir (örneğin, sinyali yakalarken veya bloke ederken), SIGKILL, engellenemeyeceği veya göz ardı edilemeyeceği için her zaman işlemi öldürür.

öldür komutu Linux'ta aynı ada sahip tüm süreçleri "öldürmek" için tasarlanmıştır. Sürecin PID'sini bilmemiz gerekmediği için bu uygundur. Örneğin, chrome adlı tüm işlemleri kapatmak istiyoruz. Terminalde çalıştırın:

killall komutu, kill gibi, varsayılan olarak bir SIGTERM sinyali gönderir. Başka bir sinyal göndermek için seçeneği kullanın. -s . Örneğin:

Size Linux'ta bir işlemi nasıl sonlandıracağınızı göstereceğiz. Linux'un ana avantajlarından biri, sunucuyu yeniden başlatmaya gerek kalmadan bir işlemi sonlandırabilme yeteneğidir. Bu yazıda, kill, pkill ve killall komutlarını kullanarak Linux'ta bir işlemi nasıl sonlandıracağınızı göstereceğiz.

1. PID nedir

Başlamadan önce, bir süreç kimliğinin (PID) ne olduğunu bilmemiz gerekir.

PID, içinde dijital bir süreç tanımlamasıdır. Her işlemin benzersiz bir PID'si vardır. Nitekim, örneğin, Linux tabanlı bir sistemde başlayan ilk süreç bir süreçtir ve PID'si 1'e ayarlanır. Bu süreç diğer tüm süreçlerin ebeveynidir. Başlatma işlemi, kill komutları kullanılarak sonlandırılamaz ve bu, yanlışlıkla öldürülmemesini sağlar.

Artık sunucuda çalışan her işlemin PID'sini bulmak için aşağıdaki komutu çalıştırabiliriz:

Bu bize tüm çalışan süreçlerin ve ilgili PID'lerinin bir listesini verir.

Belirli bir işlemin PID'sini bulmak istiyorsak, işlem adının ardından pidof komutunu kullanabiliriz. Örneğin MySQL işlemimizin PID'sini bulmak için aşağıdaki komutu çalıştırabiliriz:

pidof mysql

Daha fazla ayrıntı için şu komutu kullanabiliriz: ps yardımcı birlikte grep:

Not yardımcı | grep mysql

Artık bir PID'nin ne olduğunu ve belirli bir sürecin PID'sini nasıl bulacağımızı bildiğimize göre, bir sonraki bölüme geçebilir ve onu nasıl öldüreceğimizi öğrenebiliriz.

2. Linux'ta kill komutunu kullanarak bir işlemi sonlandırın

Kill komutunu kullanmaya başlamadan önce bilmemiz gereken birkaç önemli kural vardır.

  • Yalnızca kullanıcı kimliğinize ait olan kendi işlemlerini sonlandırabilirsiniz.
  • Diğer kullanıcıların işlemlerini öldüremezsiniz
  • Sistem işlemlerini öldüremezsiniz (süper kullanıcı değilseniz)
  • Kök kullanıcı, diğer herhangi bir kullanıcının sürecini ve herhangi bir sistem sürecini öldürebilir.

kill komutuyla bir işlemi öldürdüğümüzde, aslında öldürmek istediğimiz spesifik PID sinyalini gönderiyoruz. Aşağıdaki sinyaller kill komutu tarafından kullanılır:

1 = Kapat 9 = Öldür 15 = Sonlandır

Kapatma sinyali nadiren kullanılır. Çoğu zaman öldürme sinyalini kullanırız ve eğer işe yaramazsa, o zaman Sonlandırma sinyalini kullanabiliriz.

Yani öldürmek istediğimiz işlemin PID'sini bulduğumuzda, daha önce tanımladığımız yöntemlerden birini kullanın, komutu kullanabiliriz. öldür -9 PID bu belirli PID ile süreci öldürmek için.

Örneğin, PID 6738 ise aşağıdaki komutu kullanabiliriz:

Öldür -9 6738

3. Linux'ta pkill komutunu kullanarak bir işlemi sonlandırın

Onu öldürmek için PID'si yerine işlem adını kullanmak istiyorsanız, pkill komutunu kullanabilirsiniz. Örneğin, öldürmek istediğimiz işlem çağrılırsa, onu öldürmek için aşağıdaki komutu kullanabiliriz:

pkill mysql

4. Linux'ta killall komutunu kullanarak bir işlemi sonlandırın

Önceki iki komut, yalnızca belirli bir işlemi öldürmek için kullanılır. Ancak, bir süreci tüm alt süreçleriyle birlikte öldürmek istiyorsak, şu komutu kullanabiliriz: hepsini öldür:

killall mysql

Bu örnekte, MySQL sürecini ve tüm alt süreçlerini öldüreceğiz.

Linux'ta süreç öldürmenin en yaygın örnekleridir.

Linux, programlar ve çeşitli hizmetler açısından Windows'tan daha kararlı olmasına rağmen, her şey olur ve bazen Linux sürecini sonlandırmak gerekir. Bu, sistem hizmetini arka planda başlatma sisteminde değil terminal aracılığıyla başlattığınızda ve diğer birçok durumda, Linux sürecini öldürmenin daha kolay olduğu durumlarda, tüm sistemi yeniden başlattığınızda program çökerse gerekli olabilir.

Bu yazıda, bir Linux sürecini sonlandırmanın en yaygın yollarından bazılarına bakacağız. Sürecin nasıl durduğunu ve her şeyin nasıl doğru yapılacağını ayrıntılı olarak açıklayacağız.

Linux işletim sisteminde proses kontrolü, sinyaller kullanılarak gerçekleştirilir. Herhangi bir işlemin tamamlanması dahil. Sinyaller sistem tarafından gönderilir, ancak kullanıcı tarafından özel komutlar ve hatta terminaldeki klavye kısayolları kullanılarak da gönderilebilir. Bir işlemin sona ermesi için sinyal verildiğinde, bazı hazırlık çalışmaları yapmalıdır.

Alt süreçleri sonlandırmak, geçici dosyaları, soketleri vb. silmek gereklidir. Ancak durumun karmaşıklığına bağlı olarak süreç tüm sinyallere yanıt vermeyebilir. Süreci sonlandırmak için kullanılan ana sinyalleri göz önünde bulundurun:

  • SIGINT- en zararsız sonlandırma sinyali, Kesinti anlamına gelir. Ctrl+C klavye kısayolu kullanılarak bir terminalden başlatılan bir işleme gönderilir. Süreç, tüm eylemlerini doğru bir şekilde tamamlar ve kontrolü geri verir;
  • SIGQUIT- bu, klavye kısayolu aracılığıyla terminalde çalışan bir programa gönderilen başka bir sinyaldir. Sonlandırmasını söyler ve program zarif bir şekilde sinyali sonlandırabilir veya yok sayabilir. Bir öncekinden farklı olarak, bir bellek dökümü oluşturur. Klavye kısayolu Ctrl+/;
  • SIGHUP- İnternet bağlantısı koptuğunda esas olarak sistem tarafından gönderilen kontrol terminaline bağlantının koptuğunu prosese bildirir;
  • SIGTERM- süreci hemen sonlandırır, ancak program tarafından işlenir, bu nedenle alt süreçleri sonlandırmasına ve tüm kaynakları serbest bırakmasına izin verir;
  • SIGKILL- ayrıca işlemi hemen sonlandırır, ancak önceki seçenekten farklı olarak işlemin kendisine aktarılmaz, ancak çekirdek tarafından işlenir. Bu nedenle, kaynaklar ve alt süreçler çalışmaya devam eder.

Sürece incelikle tamamlanması için bir şans vermeniz gerektiğini anlamak önemlidir. Bağlantı noktalarının ve soketlerin serbest bırakılması, kapatılması ve geçici dosyaların kaldırılması arzu edilir. Bu nedenle, asla hemen bir SIGKILL göndermeyin. Sonlandırma sinyallerini yukarıda listelendiği gibi sırayla gönderin.

Öncelikle ctrl+c, mümkünse, o zaman SIGTERM - süreci sonlandırmasına rağmen, bunu kültürel olarak ve yalnızca son çare olarak SIGKILL olarak yapar. Şimdi pratikte pid Linux tarafından bir işlemin nasıl sonlandırılacağına bakalım. Her zaman SIGKILL kullanıyorsanız, bu resim akla gelir:

Bir Linux süreci nasıl öldürülür?

Kill yardımcı programı, Linux'ta süreçleri bildirmek için kullanılır. Sözdizimi çok basittir:

$ kill -pid_process sinyali

Sinyal, işlemi sonlandırmak için yukarıdaki sinyallerden biridir. Varsayılan olarak, bu parametre belirtilmezse, çok doğru olan SIGTERM sinyali kullanılır. Ayrıca hangi işlemin sonlandırılacağını da belirtmemiz gerekiyor. Bunun için benzersiz bir süreç tanımlayıcısı kullanılır - PID.

Diyelim ki çalışan bir ping yardımcı programımız var. Öldürerek bitirmek istiyoruz. Ardından, önce ps komutunu kullanarak kimliğini öğreniyoruz:

ps yardımcı | grep ping'i

İlk satır ping yardımcı programının kendisini gösterecek ve ikinci satır ps programının kendisini gösterecektir. İstenilen PID'yi alıp SIGTERM kullanarak işlemi sonlandırıyoruz:

öldür - DÖNEM 20446

Ve ancak bu komuttan sonra işlem askıda kalmaya devam ederse ve bunu ps çalıştırarak kontrol edebilirsiniz. Sadece şimdi SIGKILL yapabilirsiniz:

öldür -ÖLDÜR 20446

Şimdi tekrar kontrol ediyoruz:

İşlem root olarak çalışıyorsa, doğal olarak sudo kullanmanız gerekir. En azından hala bu PID'yi bulmanız gerektiğinden, bir işlemi PID'si ile öldürmek her zaman uygun değildir. İşlem adından pid'i otomatik olarak hesaplamak ve onu hemen sonlandırmak için çok sayıda karmaşık yapı oluşturmak için xargs kullanabiliriz, ancak bu gerekli değildir. Zaten özel araçlar var.

pkill ile bir süreç nasıl öldürülür

pkill yardımcı programı kill için bir sarmalayıcıdır, tamamen aynı şekilde davranır ve aynı sözdizimine sahiptir, yalnızca işlem kimliği olarak işlemin adını iletilmesi gerekir. Yardımcı program proc dizinini tarar ve bu ada sahip ilk işlemin PID'sini bulur, ardından ona SIGTERM gönderir. Böylece Linux adlı bir işlemi öldürebilirsiniz. Örneğin aynı ping'i sonlandırmak istiyorsak:

Sinyal türünü manuel olarak da ayarlayabilirsiniz:

pkill -TERM ping

İşlemin pidini bulmak için ps yerine pgrep yardımcı programını kullanabilir, programımızın bittiğinden emin olabilirsiniz:

Ancak program sizin için birkaç işlem oluşturduysa, örneğin, krom tarayıcı veya firefox sekmelerin her biri için ayrı bir işlem oluşturursa, bu yardımcı program pek yardımcı olmaz. İşte bir sonraki seçenek.

Killall ile bir süreç nasıl durdurulur

killall önceki iki yardımcı programa benzer şekilde çalışır. Ayrıca parametre olarak işlem adını alır ve /proc dizininde PID'sini arar. Ancak bu yardımcı program, bu adla tüm işlemleri algılayacak ve sonlandıracaktır. Örneğin:

Gördüğünüz gibi, çalışan birkaç işlem var, Linux işlemini killall ile durdurmaya devam ediyor:

Komut, çalışan tüm ping yardımcı programlarını sonlandıracaktır, bunu pgrep'i tekrar çalıştırarak doğrulayabilirsiniz:

sonuçlar

Bu yazıda, bir Linux sürecinin nasıl sonlandırılacağına baktık. Bazen bu görev çok faydalı olabilir, ancak doğru yapılması gerektiğini anlamak önemlidir. Bu, SIGTERM yerine SIGKILL'i geçmenin çok tehlikeli olduğu anlamına gelmez, ancak bunu yapmamalısınız. Umarım bu bilgiler size yardımcı olmuştur.