Anda memiliki beberapa opsi. Salah satunya adalah menghentikan skrip ( CtrlZ), dapatkan PID skrip dan kirim SIGKILLke 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 killperintah, pemimpin proses dilambangkan sebagai berikut:
kill -PID
Di mana PIDID proses skrip.
Contoh:
Pertimbangkan skrip test.shyang meluncurkan beberapa proses. Katakanlah Anda menjalankannya di shell:
$ ./test.sh
Di terminal lain,
$ 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)
Dalam hal ini, untuk mengirim sinyal ke grup proses yang dibuat oleh test.sh, Anda harus:
kill -INT -17802
-INTdigunakan untuk mengirim SIGINT, dan perintah ini setara dengan menekan CtrlCpada terminal. Untuk mengirim SIGKILL:
kill -KILL -17802
Anda hanya perlu menghentikan skrip jika Anda tidak dapat membuka terminal lain. Jika Anda bisa, gunakan pgrepuntuk menemukan PID.
Salah satu perintah yang diluncurkan skrip mungkin menjebak SIGINT, yang mungkin mengapa CtrlCtidak efektif. Namun, SIGKILLtidak dapat dijebak, dan ini biasanya merupakan pilihan terakhir . Anda mungkin ingin mencoba SIGTERM( -TERM) sebelum melakukan pembunuhan. Baik SIGKILLatau SIGTERMdapat diatur sebagai cara pintas keyboard seperti SIGINTini.
Semua ini bisa diperdebatkan jika skrip Anda tidak mengandung garis shebang. Dari jawaban SO ini :
Biasanya shell induk menebak bahwa script ditulis untuk shell yang sama (shell Bourne-like minimal menjalankan script dengan / bin / sh, bash menjalankannya sebagai subproses bash) ...
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.
Ctrl + z