คุณมีตัวเลือกน้อย หนึ่งคือการหยุดสคริปต์ ( 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