ฉันจะฆ่างานพื้นหลังที่เกิดใหม่ล่าสุดใน linux ได้อย่างไร
ตัวอย่าง:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
ฉันจะฆ่างานพื้นหลังที่เกิดใหม่ล่าสุดใน linux ได้อย่างไร
ตัวอย่าง:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
คำตอบ:
มีตัวแปรพิเศษสำหรับสิ่งนี้ใน bash:
kill $!
$! ขยายเป็น PID ของกระบวนการสุดท้ายที่ดำเนินการในพื้นหลัง
^Z
ไม่ทำให้งานพื้นหลังหยุดงาน bg
'การแบ็คกราวน์' ที่แท้จริงจะตามมา(ดำเนินการต่อในพื้นหลัง) และหลังจากนั้นจะ$!
ทำงานตามที่คาดไว้
????
หมายถึงคำสั่งอย่างน้อยหนึ่งคำสั่งที่จะถูกดำเนินการหลังจากการฆ่าหากคำสั่งใด ๆ เหล่านั้นขึ้นอยู่กับงานที่ทำโดยกระบวนการพื้นหลังให้คำนึงถึงงานล้างหรือการตกแต่งที่กระบวนการพื้นหลังอาจดำเนินการในตัวจัดการสัญญาณหลังจาก รับสัญญาณ (trappable) ดีที่สุดในการเพิ่มwait
(ตามด้วย a sync
หรือแม้แต่ a sleep <n>
) ก่อนคำสั่ง 'dependent' ของคำสั่งใด ๆ
คุณสามารถฆ่าโดยหมายเลขงาน เมื่อคุณวางงานในพื้นหลังคุณจะเห็นสิ่งที่ชอบ:
$ ./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/...เช่นกัน
%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 อีกครั้งซึ่งน่าเบื่อ
while true
while sleep 1
สิ่งนี้จะทำให้คุณมีความล่าช้าเล็กน้อยก่อนที่จะเริ่มใหม่หากคุณสามารถอยู่กับสิ่งนั้นได้และหากคุณกด ctrl-c สองครั้งหนึ่งครั้งที่สองจะขัดขวางการนอนหลับโดยปิดท้ายด้วยทางออกที่ไม่เป็นศูนย์และหลุดออกจากวง
คำสั่งต่อไปนี้ให้รายการกระบวนการพื้นหลังทั้งหมดในเซสชันของคุณพร้อมกับ pid จากนั้นคุณสามารถใช้มันเพื่อฆ่ากระบวนการ
jobs -l
ตัวอย่างการใช้งาน:
$ sleep 300 &
$ jobs -l
[1]+ 31139 Running sleep 300 &
$ kill 31139
สิ่งนี้จะทำให้กระบวนการเบื้องหลังทั้งหมด:
jobs -p | xargs kill -9
kill -9 %%
พิมพ์น้อย :)
skill doB
skill
เป็นเวอร์ชันของคำสั่ง kill ที่ให้คุณเลือกหนึ่งกระบวนการหรือหลายกระบวนการตามเกณฑ์ที่กำหนด
คุณต้องการ pid ... ใช้ "ps -A" เพื่อค้นหา
นี่เป็นคำตอบที่ไม่อยู่ในหัวข้อ แต่สำหรับผู้ที่สนใจมันอาจมีค่า
เช่นเดียวกับในคำตอบของ @John Kugelman% จะเกี่ยวข้องกับข้อกำหนดงาน ทำอย่างไรจึงจะหาได้อย่างมีประสิทธิภาพ? ใช้คำสั่ง & รูปแบบน้อยลงดูเหมือนว่าคนใช้เพจเจอร์น้อย (ไม่แน่ใจ) ใน man bash type &% จากนั้นพิมพ์ Enter จะแสดงเฉพาะบรรทัดที่มี '%' เท่านั้นเพื่อพิมพ์ใหม่ทั้งหมด จากนั้นกด Enter
เพียงใช้คำสั่ง killall:
ชื่องาน killall
สำหรับข้อมูลเพิ่มเติมและตัวเลือกขั้นสูงเพิ่มเติมให้พิมพ์ "man killall"
killall python
หรือkillall java
ในขณะที่มีบางสิ่งที่มีประโยชน์ในการทำงานทุกที่ในระบบ