ฉันจะฆ่างานพื้นหลังที่เกิดใหม่ล่าสุดใน 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ในขณะที่มีบางสิ่งที่มีประโยชน์ในการทำงานทุกที่ในระบบ