คุณมีตัวเลือกน้อย หนึ่งคือการหยุดสคริปต์ ( CtrlZ) รับ PID ของสคริปต์และส่งSIGKILLไปยังกลุ่มกระบวนการ
เมื่อคำสั่งถูกเรียกใช้ในเชลล์กระบวนการจะเริ่มต้นและชายด์ทั้งหมดของมันเป็นส่วนหนึ่งของกลุ่มกระบวนการเดียวกัน(ในกรณีนี้คือกลุ่มกระบวนการพื้นหน้า) ในการส่งสัญญาณไปยังกระบวนการทั้งหมดในกลุ่มนี้คุณส่งไปยังผู้นำกระบวนการ สำหรับkillคำสั่งนั้นหัวหน้ากระบวนการจะแสดงดังนี้:
kill -PID
ที่ไหนPIDเป็นกระบวนการ ID ของสคริปต์
ตัวอย่าง:
พิจารณาสคริปต์test.shที่เปิดตัวกระบวนการบางอย่าง สมมติว่าคุณใช้มันในเปลือก:
$ ./test.sh
ในอาคารผู้โดยสารแห่งอื่น
$ 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)
ในกรณีนี้หากต้องการส่งสัญญาณไปยังกลุ่มกระบวนการที่สร้างโดยtest.shคุณต้องทำ:
kill -INT -17802
-INTใช้ในการส่งSIGINTคำสั่งนี้จึงเทียบเท่ากับการกดCtrlCบนเทอร์มินัล ในการส่งSIGKILL:
kill -KILL -17802
คุณจะต้องหยุดสคริปต์หากคุณไม่สามารถเปิดเทอร์มินัลอื่นได้ หากคุณสามารถใช้pgrepเพื่อค้นหา PID
หนึ่งในคำสั่งที่สคริปต์เปิดใช้อาจมีการวางกับดักSIGINTซึ่งอาจเป็นสาเหตุที่CtrlCไม่มีประสิทธิภาพ แต่SIGKILLไม่สามารถติดอยู่และก็มักจะเป็นสุดท้ายรีสอร์ทตัวเลือก คุณอาจต้องการลองSIGTERM( -TERM) ก่อนไปฆ่า ค่าSIGKILLหรือSIGTERMสามารถตั้งค่าเป็นแป้นพิมพ์ลัดวิธีการSIGINTคือ
ทั้งหมดนี้เป็นสิ่งที่สงสัยหากสคริปต์ของคุณไม่มีเส้น Shebang จากคำตอบ SO นี้ :
โดยปกติแล้วเชลล์พาเรนต์จะเดาว่าสคริปต์นั้นถูกเขียนขึ้นสำหรับเชลล์เดียวกัน (เชลล์ที่เหมือนบอร์นน้อยที่สุดจะรันสคริปต์ด้วย / bin / sh, bash จะเรียกใช้เป็น subprocess ของ bash) ...
ด้วยเหตุนี้เมื่อสคริปต์ถูกดำเนินการคุณจะไม่พบกระบวนการที่ตั้งชื่อตามสคริปต์ (หรือกระบวนการที่มีชื่อสคริปต์ในบรรทัดคำสั่ง) และpgrepจะล้มเหลว
ใช้เส้น Shebang เสมอ
Ctrl + z