Saya telah menulis skrip bash yang memanggil beberapa program lain dan menjalankan banyak perintah. Saya menjalankan skrip ini dari terminal. Sekarang saya ingin membunuh skrip.
Menekan Ctrl + C
kadang tidak memotongnya, saya pikir karena terkadang skrip mengeksekusi program lain, dan untuk beberapa alasan sinyal mematikan tidak berfungsi.
Namun, jika saya menutup jendela terminal, itu akan mematikan skrip.
Apakah ada sesuatu yang dapat saya lakukan (kombinasi keyboard), yang analog dengan menutup jendela terminal, tanpa benar-benar menutup jendela terminal (Saya tidak ingin kehilangan riwayat perintah, direktori saat ini, riwayat keluaran, dll)?
Ctrl + z
Ctrl + z
lari:kill -9 $(pgrep -f your_script.sh)
Jawaban:
Anda memiliki beberapa opsi. Salah satunya adalah menghentikan skrip ( CtrlZ), dapatkan PID skrip dan kirim
SIGKILL
ke grup proses.Ketika sebuah perintah dieksekusi dalam sebuah shell, proses itu dimulai dan semua anak-anaknya adalah bagian dari grup proses yang sama (dalam hal ini, grup proses latar depan). Untuk mengirim sinyal ke semua proses dalam grup ini, Anda mengirimkannya ke pemimpin proses. Untuk
kill
perintah, pemimpin proses dilambangkan sebagai berikut:Di mana
PID
ID proses skrip.Contoh:
Pertimbangkan skrip
test.sh
yang meluncurkan beberapa proses. Katakanlah Anda menjalankannya di shell:Di terminal lain,
Dalam hal ini, untuk mengirim sinyal ke grup proses yang dibuat oleh
test.sh
, Anda harus:-INT
digunakan untuk mengirimSIGINT
, dan perintah ini setara dengan menekan CtrlCpada terminal. Untuk mengirimSIGKILL
:Anda hanya perlu menghentikan skrip jika Anda tidak dapat membuka terminal lain. Jika Anda bisa, gunakan
pgrep
untuk menemukan PID.Salah satu perintah yang diluncurkan skrip mungkin menjebak
SIGINT
, yang mungkin mengapa CtrlCtidak efektif. Namun,SIGKILL
tidak dapat dijebak, dan ini biasanya merupakan pilihan terakhir . Anda mungkin ingin mencobaSIGTERM
(-TERM
) sebelum melakukan pembunuhan. BaikSIGKILL
atauSIGTERM
dapat diatur sebagai cara pintas keyboard sepertiSIGINT
ini.Semua ini bisa diperdebatkan jika skrip Anda tidak mengandung garis shebang. Dari jawaban SO ini :
Karena itu, ketika skrip dieksekusi, Anda tidak akan menemukan proses yang dinamai skrip (atau proses dengan nama skrip di baris perintah) dan
pgrep
akan gagal.Selalu gunakan garis shebang.
sumber
SIGKILL
atauSIGTERM
?pgrep test.sh
tidak mengembalikan PID untuk saya. Saya mencoba test.sh sederhana:for i in {1..30}; do sleep 1 echo $i done
Ketikatest.sh
sedang berjalan, saya mengeksekusipgrep test.sh
di terminal lain, tetapi tidak ada yang dikembalikan. Apa yang salah?pgrep -f test.sh
.pgrep -f test.sh
juga tidak bekerja. Saya menjalankan skrip dengan./test.sh
Jika Anda mengetahui proses yang terkait dengan skrip Anda dapat menemukan PID mereka menggunakan
dan kemudian menggunakan nomor PID untuk mematikan proses yang terkait menggunakan
sumber
Seperti yang dikatakan Harris, Anda dapat menjalankan
Kill -9 PID_Number
tetapi Anda juga dapat menginstal paket yang dikenalhtop
memiliki peramban proses interaktif yang membuat proses pencarian lebih mudah. htop juga mendukung proses pembunuhan.sumber