Çok az seçeneğin var. Bunlardan biri script'i ( CtrlZ) durdurmak, betiğin PID'sini almak SIGKILLve işlem grubuna göndermek .
Bir komut kabuğunda çalıştırıldığında, başlattığı işlem ve tüm çocukları aynı işlem grubunun bir parçasıdır (bu durumda ön plan işlem grubu). Bu gruptaki tüm işlemlere bir sinyal göndermek için onu işlem liderine gönderirsiniz. İçin killkomut, işlem lideri bu şekilde ifade edilir:
kill -PID
PIDKomut dosyasının işlem kimliği nerede .
Örnek:
test.shBazı işlemleri başlatan bir komut dosyası düşünün . Diyelim ki bir kabuğa koştunuz:
$ ./test.sh
Başka bir terminalde
$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
├─sleep(17805)
└─yes(17803)
Bu durumda, tarafından oluşturulan süreç grubuna bir sinyal göndermek için test.shşunları yaparsınız:
kill -INT -17802
-INTgöndermek için kullanılır SIGINTve bu komut CtrlCterminalde basmaya eşdeğerdir . Göndermek için SIGKILL:
kill -KILL -17802
Sadece başka bir terminal açamıyorsanız betiği durdurmanız gerekir. Yapabiliyorsanız, pgrepPID'yi bulmak için kullanın .
Komut dosyasının başlattığı komutlardan biri bindirme olabilir SIGINT, bu nedenle muhtemelen CtrlCetkisizdir. Ancak, SIGKILLkapana kısılmış olamaz ve genellikle son çare seçeneğidir. Öldürmeye gitmeden önce SIGTERM( -TERM) denemek isteyebilirsiniz . Ne SIGKILLya SIGTERMbir şekilde ayarlanabilir klavye kısayol yolu SIGINTolduğunu.
Komut dosyanızın bir shebang satırı içermemesi durumunda tüm bunlar tartışmalıdır. Gönderen bu SO cevap :
Genellikle ana kabuk betiğin aynı kabuk için yazıldığını tahmin eder (asgari Bourne benzeri kabukları betiği / bin / sh ile çalıştırır, bash bash alt işlemi olarak çalıştırır) ...
Bu nedenle, komut dosyası yürütüldüğünde, komut dosyasından sonra adlandırılan bir işlemi (veya komut satırında komut dosyasının adını taşıyan bir işlem) bulamazsınız ve pgrepbaşarısız olur.
Her zaman bir shebang hattı kullanın.
Ctrl + z