จะยุติกระบวนการพื้นหลังได้อย่างไร?


196

ฉันได้เริ่มต้น wget &บนเครื่องระยะไกลในพื้นหลังใช้ ทันใดนั้นมันก็หยุดดาวน์โหลด ฉันต้องการที่จะยุติกระบวนการของมันแล้วเรียกใช้คำสั่งอีกครั้ง ฉันจะยุติมันได้อย่างไร

ฉันไม่ได้ปิดหน้าต่างเชลล์ แต่เท่าที่ทราบมันไม่ได้หยุดการใช้Ctrl+ Cและ+CtrlZ

คำตอบ:


256

มีหลายวิธีที่จะไปเกี่ยวกับเรื่องนี้

วิธีที่ # 1 - ps

คุณสามารถใช้psคำสั่งเพื่อค้นหา ID กระบวนการสำหรับกระบวนการนี้จากนั้นใช้ PID เพื่อฆ่ากระบวนการ

ตัวอย่าง

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

วิธีที่ # 2 - pgrep

pgrepนอกจากนี้คุณยังสามารถค้นหารหัสขั้นตอนโดยใช้

ตัวอย่าง

$ pgrep wget
1234

$ kill 1234

วิธีที่ # 3 - pkill

หากคุณแน่ใจว่าเป็นคนเดียวที่wgetคุณเรียกใช้คุณสามารถใช้คำสั่งpkillเพื่อฆ่างานตามชื่อ

ตัวอย่าง

$ pkill wget

วิธีที่ # 4 - งาน

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

ตัวอย่าง

งานปลอมของฉัน, sleep.

$ sleep 100 &
[1] 4542

หามันเป็นงาน หมายเหตุ:หมายเลข 4542 เป็น ID กระบวนการ

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

วิธีที่ # 5 - fg

คุณสามารถนำงานที่แบ็กกราวน์กลับมาที่เบื้องหน้าโดยใช้fgคำสั่ง

ตัวอย่าง

งานปลอม, sleep.

$ sleep 100 &
[1] 4650

รับหมายเลขของงาน

$ jobs
[1]+  Running                 sleep 100 &

นำงาน # 1 กลับไปเบื้องหน้าและจากนั้นใช้+CtrlC

$ fg 1
sleep 100
^C
$

jobsไม่มีoutputและsais:fg -bash: fg: 1: no such jobแต่การพิมพ์fgทำได้ดีและใช้pkill wgetงานได้ดี แต่ps -eaf|grep wgetแล้วkill <process number>ปริมาณไม่หยุดงาน PS: ผมใช้ตัวเลขที่สามเป็นจำนวนกระบวนการ
Mohammad Etemaddar

1
@MohammadEtemaddar - ใช้หมายเลข 2 psจากการส่งออกของ # 3 เป็นรหัสกระบวนการของผู้ปกครอง
slm

1
@ MohammadEtemaddar - อ่า ps กำลังค้นหา grep ps -eaef| grep [w]getทำเช่นนี้
slm

1
@MohammadEtemaddar - คุณสามารถใช้pgrepแทนpgrep wgetได้
slm

2
@ MohammadEtemaddar - ขอโทษ e พิเศษเป็นตัวพิมพ์ผิด ps -eaf | grep [w]getควรอ่าน ตัวเลือกที่อยู่ในpsหน้าคน man ps.
slm

70

ใน bash คุณสามารถใช้fgเพื่อให้ได้งานไปยังเบื้องหน้าแล้วใช้Ctrl+C

หรือทำรายการกระบวนการในเบื้องหลังด้วยjobsแล้วทำ

kill %1

(มี 1 แทนที่ด้วยหมายเลขjobsให้คุณ)


13

คุณสามารถใช้kill $!ฆ่างานที่มีพื้นหลังล่าสุดได้เท่ากัน


หากมันถูกใช้เป็นคำสั่งเช่นนามแฝงในโปรไฟล์ทุบตีให้แน่ใจว่าได้ห่อด้วยเครื่องหมายคำพูดเดี่ยว
Nate Ritter

6

แก้ไข: เมื่ออยู่เบื้องหน้าคุณสามารถCtrl+ Cหรือตามที่ @Zelda กล่าวถึงฆ่าด้วย '% x' โดยที่ 'x' เป็นหมายเลขงานจะส่งสัญญาณเริ่มต้น (SIGTERM ส่วนใหญ่ในกรณีของ Linux)

เพียงพิมพ์fgเพื่อนำมาไว้ด้านหน้าเบื้องหน้าหากเป็นกระบวนการสุดท้ายที่คุณทำไว้เบื้องหลัง (ด้วย '&')

หากไม่ใช่คนสุดท้ายให้พิมพ์: jobsและค้นหา 'job number' ที่แสดงใน '[]' จากนั้นเพียงพิมพ์:

fg 2

..where '2' เป็นหมายเลขงานตัวอย่างเช่น:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.

4

วิธีที่ถูกต้องคือพิมพ์jobsจากนั้นใช้หมายเลขงานเพื่อฆ่า เพื่อที่จะใช้ pid เพื่อฆ่ามันคุณต้องนำมันมาที่เบื้องหน้าดังที่ระบุไว้ในคำตอบแรก

ลองสิ่งนี้

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

หากคุณทำงานทันทีหลังจากที่ฆ่าคุณควรเห็นสิ่งนี้

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

pidofสิ่งหนึ่งที่ผมไม่เห็นที่นี่ซึ่งผมเคยพบว่ามีประโยชน์มากโดยเฉพาะอย่างยิ่งเมื่อการทดสอบออกคำสั่งเป็น คุณสามารถใช้pidof [command]เพื่อค้นหารหัสกระบวนการของกระบวนการที่กำลังทำงานอยู่ ฉันชอบเพราะมันช่วยให้ฉันสามารถค้นหารหัสของคำสั่งที่ฉันต้องการได้อย่างรวดเร็วซึ่งโดยปกติจะเป็นสิ่งที่ฉันเพิ่งเรียกใช้

เมื่อคุณมี pid คุณก็สามารถฆ่ากระบวนการ มันช่วยให้การสร้างสคริปต์ง่าย ๆ สำหรับฆ่ากระบวนการเฉพาะถ้ามันกำลังทำงานอยู่


1
อ่านี่ช่วยฉันได้! kill% 1 ไม่ทำงานด้วยเหตุผลบางอย่าง "kill: ไม่สามารถแยกอาร์กิวเมนต์: '% 1'" และ Ctrl + C ไม่ทำงาน ไม่สามารถหากระบวนการใน ps หรืออะไรก็ได้เพราะมันเป็นรูต (ฉันลืมฉันใช้ sudo กับมัน)
mjohnsonengr

1

ตัวอย่างทั่วไปคือstressเครื่องมือ สมมติว่าคุณวิ่งต่อไปนี้:

$ stress -c 4 -m 4 

และปิดหน้าต่างเทอร์มินัล กระบวนการนี้จะกินทรัพยากรของคุณจากพื้นหลังต่อไป

เธอเป็นสิ่งที่ฉันทำ:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrepแสดงรายการ PID ของกระบวนการที่ถูกยัดเยียดและเก็บไว้ในตัวแปรxซึ่งจะถูกใช้kill -9เพื่อยุติมัน


0

ใน bash กระบวนการหยุดล่าสุด (Ctrl-Z) คุณจะฆ่าโดย:

kill %%
kill -9 %%

หรือหากต้องการเลือกใช้:

jobs

แล้ว:

kill %N

ชอบ kill %2

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