linux: kill งานพื้นหลัง


195

ฉันจะฆ่างานพื้นหลังที่เกิดใหม่ล่าสุดใน linux ได้อย่างไร

ตัวอย่าง:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????

18
สิ่งนี้จะไม่เกี่ยวข้องกับการเขียนโปรแกรมได้อย่างไร การเขียนโปรแกรม Bash ไม่ใช่การเขียนโปรแกรม?
flybywire

6
นี่เป็นพื้นที่ทับซ้อนระหว่าง SO กับ SU แต่ฉันคิดว่ามันเหมาะกับ SO เกณฑ์ของฉันสำหรับการคิดแบบนี้คือถ้า @flybywire ทำสิ่งนี้ในสคริปต์มันเป็นโปรแกรม ถ้าเขาแค่อยากทำมันจากบรรทัดคำสั่งผมก็บอกว่ามันเป็นของ SU
Bill the Lizard

10
การเขียนสคริปต์เชลล์ก็กำลังตั้งโปรแกรมเช่นกัน
cletus

คำตอบ:


234

มีตัวแปรพิเศษสำหรับสิ่งนี้ใน bash:

kill $!

$! ขยายเป็น PID ของกระบวนการสุดท้ายที่ดำเนินการในพื้นหลัง


68
@ polm23; ไม่^Zไม่ทำให้งานพื้นหลังหยุดงาน bg'การแบ็คกราวน์' ที่แท้จริงจะตามมา(ดำเนินการต่อในพื้นหลัง) และหลังจากนั้นจะ$!ทำงานตามที่คาดไว้
falstro

สมมติว่า????หมายถึงคำสั่งอย่างน้อยหนึ่งคำสั่งที่จะถูกดำเนินการหลังจากการฆ่าหากคำสั่งใด ๆ เหล่านั้นขึ้นอยู่กับงานที่ทำโดยกระบวนการพื้นหลังให้คำนึงถึงงานล้างหรือการตกแต่งที่กระบวนการพื้นหลังอาจดำเนินการในตัวจัดการสัญญาณหลังจาก รับสัญญาณ (trappable) ดีที่สุดในการเพิ่มwait(ตามด้วย a syncหรือแม้แต่ a sleep <n>) ก่อนคำสั่ง 'dependent' ของคำสั่งใด ๆ
แอ๊

2
สำหรับการทำให้เสร็จ: ในฐานะ% เดียวยังหมายถึงงานปัจจุบันคุณสามารถฆ่างานที่หยุด (^ z) ด้วย "kill%" ฉันใช้มันเกือบทุกครั้งหลังจาก ^ z
t3o

ใช้งานได้เฉพาะเมื่อคุณเปิดใช้งานการควบคุมงานซึ่งจะเปิดใช้งานตามค่าเริ่มต้นในเชลล์แบบโต้ตอบเท่านั้น (แต่เนื่องจากคุณหมายถึงการใช้ ctrl-z ฉันเดาว่าคุณกำลังอ้างถึงการใช้เชลล์แบบโต้ตอบด้วย) - แต่สิ่งนี้ได้รับ ระบุไว้ในคำตอบอื่น ๆ ที่นี่ไม่แน่ใจว่าทำไมนี่คือ "เพื่อความครบถ้วนสมบูรณ์" :)
46499

289

คุณสามารถฆ่าโดยหมายเลขงาน เมื่อคุณวางงานในพื้นหลังคุณจะเห็นสิ่งที่ชอบ:

$ ./script &
[1] 35341

นั่น[1]คือหมายเลขงานและสามารถอ้างอิงได้เช่น:

$ kill %1
$ kill %%  # Most recent background job

หากต้องการดูรายการหมายเลขงานให้ใช้jobsคำสั่ง เพิ่มเติมจากman bash:

มีหลายวิธีในการอ้างถึงงานในเชลล์ ตัวละคร%แนะนำชื่องาน จำนวนงานอาจจะเรียกว่าn %nงานอาจถูกอ้างถึงโดยใช้ส่วนนำหน้าของชื่อที่ใช้ในการเริ่มต้นหรือใช้สตริงย่อยที่ปรากฏในบรรทัดคำสั่ง ตัวอย่างเช่น%ceหมายถึงceงานที่หยุด หากคำนำหน้าตรงกับงานมากกว่าหนึ่งงาน bash จะรายงานข้อผิดพลาด ใช้%?ceในมืออื่น ๆ หมายถึงงานใด ๆ ที่มีสตริงceในบรรทัดคำสั่ง หากสตริงย่อยตรงกับงานมากกว่าหนึ่งงาน bash จะรายงานข้อผิดพลาด สัญลักษณ์%%และ%+อ้างถึงแนวคิดของเชลล์ของงานปัจจุบันซึ่งเป็นงานสุดท้ายที่หยุดในขณะที่มันอยู่ในเบื้องหน้าหรือเริ่มในพื้นหลัง %-งานก่อนหน้านี้อาจจะใช้อ้างอิง ในการส่งออกที่เกี่ยวข้องกับงาน (เช่นการส่งออกของคำสั่งงาน) งานปัจจุบันถูกตั้งค่าสถานะเสมอกับและงานก่อนหน้านี้ด้วย+ -งานเดียว%(ที่ไม่มีคุณสมบัติงานที่แนบมาด้วย) ก็หมายถึงงานปัจจุบัน


สำหรับบันทึกฉันคิดว่ามันใช้งานได้ก็ต่อเมื่อเปิดใช้งานการควบคุมงาน แม้ว่าฉันคิดว่าคุณสามารถเปิดใช้งานในสคริปต์ ( set -m) แต่มันมีไว้สำหรับการใช้งานแบบโต้ตอบ ดูstackoverflow.com/questions/690266/...เช่นกัน
falstro

9
สัญลักษณ์ที่มีประโยชน์มากเหล่านี้%1และ%%- โดยเฉพาะอย่างยิ่ง บางสิ่งที่ไม่ตายใน Ctrl-C, ดังนั้นคุณต้อง Ctrl-Z kill -9 %%พวกเขาแล้ว ตัวอย่างหนึ่งที่ฉันพบว่ามีประโยชน์คือ: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Ctrl-C จะนำคุณไปยังการวนซ้ำถัดไป ก่อนที่ฉันจะต้องทำpsหรืออาจจะjobs -lแล้วพิมพ์ PID อีกครั้งซึ่งน่าเบื่อ
Tomasz Gandor

มีหนึ่งสำหรับงานทั้งหมดหรือไม่
CMCDragonkai

3
@TomaszGandor นั่นเป็นเหตุผลที่คุณอาจต้องการที่จะเปลี่ยนด้วยwhile true while sleep 1สิ่งนี้จะทำให้คุณมีความล่าช้าเล็กน้อยก่อนที่จะเริ่มใหม่หากคุณสามารถอยู่กับสิ่งนั้นได้และหากคุณกด ctrl-c สองครั้งหนึ่งครั้งที่สองจะขัดขวางการนอนหลับโดยปิดท้ายด้วยทางออกที่ไม่เป็นศูนย์และหลุดออกจากวง
falstro

45

คำสั่งต่อไปนี้ให้รายการกระบวนการพื้นหลังทั้งหมดในเซสชันของคุณพร้อมกับ pid จากนั้นคุณสามารถใช้มันเพื่อฆ่ากระบวนการ

jobs -l

ตัวอย่างการใช้งาน:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139

25

สิ่งนี้จะทำให้กระบวนการเบื้องหลังทั้งหมด:

jobs -p | xargs kill -9

1
นี่คือสิ่งที่ฉันจะใช้ก่อนหน้านี้ แต่kill -9 %%พิมพ์น้อย :)
Tomasz Gandor

4
@TomaszGandor ที่จะฆ่าเฉพาะงานปัจจุบันเช่นงานล่าสุดหยุดในเบื้องหน้าหรือเริ่มในพื้นหลัง คำสั่งในคำตอบจะฆ่างานทั้งหมด
bitek


2
skill doB

skill เป็นเวอร์ชันของคำสั่ง kill ที่ให้คุณเลือกหนึ่งกระบวนการหรือหลายกระบวนการตามเกณฑ์ที่กำหนด



0

นี่เป็นคำตอบที่ไม่อยู่ในหัวข้อ แต่สำหรับผู้ที่สนใจมันอาจมีค่า

เช่นเดียวกับในคำตอบของ @John Kugelman% จะเกี่ยวข้องกับข้อกำหนดงาน ทำอย่างไรจึงจะหาได้อย่างมีประสิทธิภาพ? ใช้คำสั่ง & รูปแบบน้อยลงดูเหมือนว่าคนใช้เพจเจอร์น้อย (ไม่แน่ใจ) ใน man bash type &% จากนั้นพิมพ์ Enter จะแสดงเฉพาะบรรทัดที่มี '%' เท่านั้นเพื่อพิมพ์ใหม่ทั้งหมด จากนั้นกด Enter


-3

เพียงใช้คำสั่ง killall:

ชื่องาน killall

สำหรับข้อมูลเพิ่มเติมและตัวเลือกขั้นสูงเพิ่มเติมให้พิมพ์ "man killall"


4
ฉันคิดว่า killall ค่อนข้างก้าวร้าวเมื่อคุณเข้าถึง PID ได้ง่าย และอันตรายด้วยโดยเฉพาะอย่างยิ่งถ้าคุณรูท
เดฟโฟกท์

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