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


22

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

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          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

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


มันส่งSIGTERMไปยังกระบวนการซึ่งได้ทำ manคำสั่งได้เลือกที่จะไม่สนใจมัน
จอร์แดน

5
@ จอร์แดนไม่ งานที่เริ่มต้นโดยเชลล์แบบโต้ตอบมีกลุ่มกระบวนการที่แตกต่างจากเชลล์ นั่นคือวิธีที่เชลล์สามารถวางไว้ในเบื้องหน้าและพื้นหลัง ดูps -jเพื่อดูกลุ่มกระบวนการ
Stéphane Chazelas

1
คำถามนี้เป็นสำเนาของคำถาม SuperUser จริง ๆ แล้ว kill 0 ทำอะไรได้จริง? (ซึ่งย้ายมาจาก StackOverflow) ดูเพิ่มเติมคำถามเกี่ยวกับkill -0(หมายเหตุประ) ซึ่งเป็นหัวข้อที่แตกต่างกันที่ StackOverflowและที่นี่ใน Unix.SE
Adam Katz

คำตอบ:


27

มันบอกว่ามันส่งสัญญาณไปยังสมาชิกทั้งหมดของกลุ่มกระบวนการของผู้โทร

กลุ่มกระบวนการใช้เพื่อใช้การควบคุมงานในเชลล์ (สามารถใช้กับสิ่งอื่นได้ แต่การควบคุมงานเชลล์แบบโต้ตอบเป็นเหตุผลหลักสำหรับการมีอยู่ของพวกเขา)

คุณจะสังเกตเห็นว่าเมื่อคุณพิมพ์Ctrl-Cกระบวนการทั้งหมดของงานปัจจุบันจะถูกฆ่าไม่เพียงกระบวนการที่เริ่มต้นเท่านั้น นอกจากนี้ที่ไม่ฆ่างานพื้นหลัง

นั่นคือความสำเร็จกับกลุ่มกระบวนการ งานคือกลุ่มของกระบวนการที่เริ่มต้นโดยเชลล์ซึ่งเชลล์สามารถใส่ในพื้นหลังหรือเบื้องหน้า (ตั้งค่าเป็นกลุ่มกระบวนการพื้นหน้าของเทอร์มินัลหรือไม่) และฆ่าโดยรวม

คุณสามารถค้นหาข้อมูลเกี่ยวกับรหัสกลุ่มกระบวนการและรหัสเซสชันด้วยps -j( jสำหรับJการควบคุม ob)

หากต้องการฆ่ากลุ่มกระบวนการของ PGID $xคุณต้องทำดังนี้

kill -- "-$x"

kill 0 ฆ่ากลุ่มกระบวนการของผู้โทร

โปรดทราบว่าหากคุณ: /bin/kill 0เชลล์จะเริ่มงานใหม่เพื่อรันkillคำสั่งนั้นดังนั้นkillจะฆ่าตัวเองเท่านั้น

killโดยปกติแล้วจะเป็นตัวเชลล์ในตัวดังนั้นkillจะฆ่ากลุ่มกระบวนการของเชลล์

อย่างไรก็ตามเมื่อเชลล์เป็นแบบโต้ตอบมันเป็นกระบวนการจัดการกลุ่มกระบวนการดังนั้นโดยทั่วไปจะไม่มีกระบวนการอื่นในกลุ่มกระบวนการของเชลล์ กระบวนการทั้งหมดเริ่มต้นโดยเชลล์อยู่ในกลุ่มกระบวนการอื่น:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

ด้านบนsleepและpsอยู่ในกลุ่มกระบวนการที่แตกต่างกันสองกลุ่มกลุ่มหนึ่งอยู่ในพื้นหลังกลุ่มหนึ่งอยู่เบื้องหน้าและกลุ่มเหล่านั้นแตกต่างจากกลุ่มกระบวนการของเชลล์

คุณสามารถทำได้:

(man kill & sleep 1; ps -j; kill 0)

เชลล์แบบโต้ตอบจะเริ่มกลุ่มกระบวนการใหม่สำหรับ subshell นั้นและทั้ง subshell และ man (และคำสั่งอื่น ๆ ที่เริ่มต้นโดยมนุษย์เช่นเพจเจอร์ของคุณ groff ... ) จะอยู่ในกลุ่มกระบวนการเดียวกันดังนั้นkill 0จะทำงานที่นั่น ( sleepด้านบนคือให้เวลามากพอที่เพจเจอร์จะเริ่มเพื่อให้เราสามารถดูได้ในps -jเอาต์พุตก่อนที่เราจะฆ่ามัน)


kill -- -$xจริง ๆ แล้วbash: kill: (-63531) - No such processในทุบตี 5.0.11 (1) - ปล่อยบน MacOS 10.14 แต่แน่นอนว่ากระบวนการมีอยู่และทำงานอยู่ pkill -Pทำงานได้ดี
kyb

1
@kyb $ x ต้องเป็นรหัสกลุ่มกระบวนการไม่ใช่รหัสกระบวนการ ดูผลลัพธ์ของps -jเพื่อหาข้อมูลเกี่ยวกับ pgids
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.