Terminalde çalışan bir betiği, terminali kapatmadan nasıl öldürebilirim (Ctrl + C çalışmıyor)?


35

Diğer programları çağıran ve bir sürü komut yürüten bir bash betiği yazdım. Bu betiği terminalden çalıştırıyorum. Şimdi senaryoyu öldürmek istiyorum.

Ctrl + CBazen basmak onu kesmiyor, bence bazen senaryo başka bir program yürütüyor ve nedense kill sinyali çalışmıyor.

Ancak, terminal penceresini kapatırsam, betiği öldürür.

Yapabileceğim bir şey var mı (klavye birleşimi), terminal penceresini kapatmaya benzer, aslında terminal penceresini kapatmadan (komut geçmişini, geçerli dizini, çıkış geçmişini vb. Kaybetmek istemiyorum)?


8
Bu gibi durumlarda denerimCtrl + z
kenn

Ve Ctrl + zkill -9 $(pgrep -f your_script.sh)
Noam Manos,

Yanıtlar:


38

Ç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.


İçin bir klavye kombinasyonu var mı SIGKILLyoksa SIGTERM?
becko

@becko Hayır, birini
kuramazsınız

pgrep test.shPID'i benim için iade etmiyor. Basit bir test.sh denedim: for i in {1..30}; do sleep 1 echo $i done Çalışırken başka bir terminalde test.shçalıştırdım pgrep test.shancak hiçbir şey döndürülmedi. Sorun nedir?
becko

1
@becko betiği nasıl çalıştırdınız? Ayrıca dene pgrep -f test.sh.
muru

pgrep -f test.shya da çalışmıyor. Senaryoyu çalıştırıyorum./test.sh
becko

6

Komut dosyasıyla ilişkili işlemleri biliyorsanız, bunların PID’lerini

 ps -A

ve ardından PID numarasını kullanarak ilgili işlemleri öldürmek için kullanın.

 kill -9 PID_Number

1
Bu çok karmaşık. Senaryo başka programlara da yayılır ve bu programlar aynı zamanda paralel süreçler oluşturur. Tüm bu süreçleri takip etmek çok zor. Terminal penceresini kapattığınızda olanlara benzer bir şey daha basit bir çözüm olmalıdır.
becko

Pkill -P $$
Harris

1

Harris'in çalıştırabileceğinizi söylediği Kill -9 PID_Numbergibi htop, belirli işlemleri bulmayı çok kolaylaştıran etkileşimli bir işlem tarayıcısına sahip olduğu bilinen paketi de yükleyebilirsiniz . htop ayrıca öldürme işlemlerini de destekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.