kill 0 ทำอะไรได้จริง


10

ในman page, มันบอกว่า:

          0      All processes in the current process group are signaled

และฉันลองแบบนี้:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

ขณะที่ผมเข้าใจจะฆ่ากระบวนการทั้งหมดในกระบวนการปัจจุบันซึ่งรวมถึงkill 0 pid15247อย่างไรก็ตามมันไม่ได้ทำอะไรในตัวอย่างนี้ ใครบ้างมีความคิดเกี่ยวกับวิธีการใช้งานหรือไม่


คุณใช้เปลือกอะไร
FatalError

@FatalError ฉันใช้ Bash
Firegun

ดูเพิ่มเติมที่Unix.SE โคลนของคำถามนี้
Adam Katz

คำตอบ:


4

ฉันไม่พบบันทึกย่อว่าkill 0พฤติกรรมในหน้านักฆ่าของฉัน (เดเบียน) เป็นอย่างไร

แต่ฉันมีสองความคิดเห็น:

(1) "กลุ่มกระบวนการ" อาจไม่ใช่สิ่งที่คุณคาดหวัง คุณสามารถแสดง Process Group ID (PGID) ด้วยps -o "%p %P %r %c %a":

$ ps -o "%p %P %r %c %a"
  PID  PPID  PGID COMMAND         COMMAND
12124 12123 12124 zsh             -zsh
12212 12124 12212 man             man kill
12226 12212 12212 less            less
12302 12124 12302 ps              ps -o %p %P %r %c %a

ดังนั้นmanร่วมกับเครื่องมือแสดงเพจเจอร์ ( less) อยู่ในกลุ่มกระบวนการเดียวกัน แต่ที่แตกต่างจากที่เปลือก (zsh ในกรณีของฉัน)

(2) อาจมีสองkillคำสั่งต่างกัน หนึ่งที่สร้างขึ้นในbash(ดูทุบตี (1) มาตรา "SHELL BUILTIN คำสั่ง") /bin/killและภายนอก สองคนนี้อาจทำงานแตกต่างกัน! คุณสามารถอย่างชัดเจนรัฐที่หนึ่งที่คุณต้องการที่จะดำเนินการโดยการพิมพ์builtin killหรือแทนcommand kill คำสั่งภายนอกที่คุณยังสามารถเรียกใช้โดยการระบุเส้นทาง:kill/bin/kill


1
PPIDคือID กระบวนการหลักซึ่งบ่อยครั้ง แต่ไม่จำเป็นต้องเป็น ID กลุ่มกระบวนการ คอลัมน์ที่ถูกต้องคือPGIDซึ่งไม่ปรากฏในpsเอาท์พุทเริ่มต้น; คุณต้องใช้-oตัวเลือกเพื่อสร้างรูปแบบที่กำหนดเองที่รวมไว้
chepner

@chepner: ถูกต้องแล้วขอบคุณจริงๆ! ฉันสับสนโดย man man ของ ps Cygwin ของ ps (1) ซึ่งระบุว่า: "-l, --long: uids กระบวนการแสดง, PPids, pgids, winpids" อัปยศฉันฉันแก้ไขคำตอบของฉันตาม อย่างไรก็ตามคำสั่งของฉัน (เฉพาะคน + เพจเจอร์มี PGID เดียวกัน) ถูกต้องในขณะนี้ตามที่ตั้งใจไว้ (ก่อนหน้านั้นแม้กระทั่งประโยคนั้นผิด:-()
mpy

1

หากต้องการหยุดกระบวนการทั้งหมดและออกจากระบบให้ป้อน:

kill -kill 0

สิ่งนี้จะส่งสัญญาณ 9 สัญญาณ SIGKILL ไปยังกระบวนการทั้งหมดที่มี ID กลุ่มกระบวนการเท่ากับ ID กลุ่มกระบวนการของผู้ส่ง เนื่องจากเชลล์ไม่สามารถเพิกเฉยต่อสัญญาณ SIGKILL นี่จะหยุดการล็อกอินเชลล์และนำคุณออกจากระบบ

นี่คือ AIX Manual ของ IBM แต่อาจใช้แนวคิดนี้

ฟังก์ชันนี้ไม่มีอยู่ใน Linux "kill" (ดังที่ฉันเห็น); แต่นี่เป็นวิธีที่ "ฆ่า" พฤติกรรม:

ฆ่า 0 ไม่ได้ฆ่า pid 0. แต่มันเป็นตัวเลือกในการฆ่าที่จะฆ่ากระบวนการทั้งหมดในที่กลุ่มปัจจุบัน ด้วยคำสั่งของคุณคุณกำลังฆ่าทุกอย่างในกระบวนการกลุ่ม ID (GID) ของเชลล์ที่ออกคำสั่ง kill

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.