Çok az seçeneğin var. Bunlardan biri script'i ( CtrlZ) durdurmak, betiğin PID'sini almak SIGKILL
ve 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 kill
komut, işlem lideri bu şekilde ifade edilir:
kill -PID
PID
Komut dosyasının işlem kimliği nerede .
Örnek:
test.sh
Bazı 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
-INT
göndermek için kullanılır SIGINT
ve 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, pgrep
PID'yi bulmak için kullanın .
Komut dosyasının başlattığı komutlardan biri bindirme olabilir SIGINT
, bu nedenle muhtemelen CtrlCetkisizdir. Ancak, SIGKILL
kapana kısılmış olamaz ve genellikle son çare seçeneğidir. Öldürmeye gitmeden önce SIGTERM
( -TERM
) denemek isteyebilirsiniz . Ne SIGKILL
ya SIGTERM
bir şekilde ayarlanabilir klavye kısayol yolu SIGINT
olduğ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 pgrep
başarısız olur.
Her zaman bir shebang hattı kullanın.
Ctrl + z