ฉันได้เริ่มต้น wget &
บนเครื่องระยะไกลในพื้นหลังใช้ ทันใดนั้นมันก็หยุดดาวน์โหลด ฉันต้องการที่จะยุติกระบวนการของมันแล้วเรียกใช้คำสั่งอีกครั้ง ฉันจะยุติมันได้อย่างไร
ฉันไม่ได้ปิดหน้าต่างเชลล์ แต่เท่าที่ทราบมันไม่ได้หยุดการใช้Ctrl+ Cและ+CtrlZ
ฉันได้เริ่มต้น wget &
บนเครื่องระยะไกลในพื้นหลังใช้ ทันใดนั้นมันก็หยุดดาวน์โหลด ฉันต้องการที่จะยุติกระบวนการของมันแล้วเรียกใช้คำสั่งอีกครั้ง ฉันจะยุติมันได้อย่างไร
ฉันไม่ได้ปิดหน้าต่างเชลล์ แต่เท่าที่ทราบมันไม่ได้หยุดการใช้Ctrl+ Cและ+CtrlZ
คำตอบ:
มีหลายวิธีที่จะไปเกี่ยวกับเรื่องนี้
คุณสามารถใช้ps
คำสั่งเพื่อค้นหา ID กระบวนการสำหรับกระบวนการนี้จากนั้นใช้ PID เพื่อฆ่ากระบวนการ
$ ps -eaf | grep [w]get
saml 1713 1709 0 Dec10 pts/0 00:00:00 wget ...
$ kill 1713
pgrep
นอกจากนี้คุณยังสามารถค้นหารหัสขั้นตอนโดยใช้
$ pgrep wget
1234
$ kill 1234
หากคุณแน่ใจว่าเป็นคนเดียวที่wget
คุณเรียกใช้คุณสามารถใช้คำสั่งpkill
เพื่อฆ่างานตามชื่อ
$ pkill wget
หากคุณอยู่ในเปลือกเดียวกันกับที่คุณทำงานที่พื้นหลังในขณะนี้ คุณสามารถตรวจสอบว่ามันยังทำงานอยู่โดยใช้jobs
คำสั่งและฆ่ามันด้วยหมายเลขงานของมัน
งานปลอมของฉัน, sleep
.
$ sleep 100 &
[1] 4542
หามันเป็นงาน หมายเหตุ:หมายเลข 4542 เป็น ID กระบวนการ
$ jobs
[1]+ Running sleep 100 &
$ kill %1
[1]+ Terminated sleep 100
คุณสามารถนำงานที่แบ็กกราวน์กลับมาที่เบื้องหน้าโดยใช้fg
คำสั่ง
งานปลอม, sleep
.
$ sleep 100 &
[1] 4650
รับหมายเลขของงาน
$ jobs
[1]+ Running sleep 100 &
นำงาน # 1 กลับไปเบื้องหน้าและจากนั้นใช้+CtrlC
$ fg 1
sleep 100
^C
$
ps
จากการส่งออกของ # 3 เป็นรหัสกระบวนการของผู้ปกครอง
ps -eaef| grep [w]get
ทำเช่นนี้
pgrep
แทนpgrep wget
ได้
ps -eaf | grep [w]get
ควรอ่าน ตัวเลือกที่อยู่ในps
หน้าคน man ps
.
ใน bash คุณสามารถใช้fg
เพื่อให้ได้งานไปยังเบื้องหน้าแล้วใช้Ctrl+C
หรือทำรายการกระบวนการในเบื้องหลังด้วยjobs
แล้วทำ
kill %1
(มี 1 แทนที่ด้วยหมายเลขjobs
ให้คุณ)
คุณสามารถใช้kill $!
ฆ่างานที่มีพื้นหลังล่าสุดได้เท่ากัน
แก้ไข: เมื่ออยู่เบื้องหน้าคุณสามารถ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.
วิธีที่ถูกต้องคือพิมพ์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
pidof
สิ่งหนึ่งที่ผมไม่เห็นที่นี่ซึ่งผมเคยพบว่ามีประโยชน์มากโดยเฉพาะอย่างยิ่งเมื่อการทดสอบออกคำสั่งเป็น คุณสามารถใช้pidof [command]
เพื่อค้นหารหัสกระบวนการของกระบวนการที่กำลังทำงานอยู่ ฉันชอบเพราะมันช่วยให้ฉันสามารถค้นหารหัสของคำสั่งที่ฉันต้องการได้อย่างรวดเร็วซึ่งโดยปกติจะเป็นสิ่งที่ฉันเพิ่งเรียกใช้
เมื่อคุณมี pid คุณก็สามารถฆ่ากระบวนการ มันช่วยให้การสร้างสคริปต์ง่าย ๆ สำหรับฆ่ากระบวนการเฉพาะถ้ามันกำลังทำงานอยู่
ตัวอย่างทั่วไปคือstress
เครื่องมือ สมมติว่าคุณวิ่งต่อไปนี้:
$ stress -c 4 -m 4
และปิดหน้าต่างเทอร์มินัล กระบวนการนี้จะกินทรัพยากรของคุณจากพื้นหลังต่อไป
เธอเป็นสิ่งที่ฉันทำ:
$ x=`pgrep stress` ; sudo kill -9 $x
pgrep
แสดงรายการ PID ของกระบวนการที่ถูกยัดเยียดและเก็บไว้ในตัวแปรx
ซึ่งจะถูกใช้kill -9
เพื่อยุติมัน
ใน bash กระบวนการหยุดล่าสุด (Ctrl-Z) คุณจะฆ่าโดย:
kill %%
kill -9 %%
หรือหากต้องการเลือกใช้:
jobs
แล้ว:
kill %N
ชอบ kill %2
jobs
ไม่มีoutput
และsais:fg
-bash: fg: 1: no such job
แต่การพิมพ์fg
ทำได้ดีและใช้pkill wget
งานได้ดี แต่ps -eaf|grep wget
แล้วkill <process number>
ปริมาณไม่หยุดงาน PS: ผมใช้ตัวเลขที่สามเป็นจำนวนกระบวนการ