เมื่อฉันพยายามออกจากเซิร์ฟเวอร์ Linux ฉันได้รับข้อความ:
มีงานที่หยุด
: มีคำสั่งเดียวที่จะฆ่าพวกนี้เหรอ
shopt -s checkjobs
ใน. bashrc ของฉัน
เมื่อฉันพยายามออกจากเซิร์ฟเวอร์ Linux ฉันได้รับข้อความ:
มีงานที่หยุด
: มีคำสั่งเดียวที่จะฆ่าพวกนี้เหรอ
shopt -s checkjobs
ใน. bashrc ของฉัน
คำตอบ:
หากต้องการฆ่างานที่หยุดทั้งหมดภายใต้ bash อย่างรวดเร็วให้ป้อน:
kill -9 `jobs -ps`
jobs -ps
แสดงรายการ ID กระบวนการ ( -p
) ของงานที่หยุด ( -s
)
kill -9 `jobs -ps`
ส่งสัญญาณ SIGKILL ให้กับพวกเขาทั้งหมด
sudo kill `jobs -p`
ทำงานไม่ได้ แต่พิมพ์ PID อย่างชัดเจน
kill
เช่นนี้จะไม่ทำอะไรเลยเนื่องจากกระบวนการหยุดทำงานกระบวนการเหล่านั้นจะไม่ประมวลผล SIGTERM (-15) ที่ส่งไปยังกระบวนการเหล่านั้นตามค่าเริ่มต้น
ลองพิมพ์สิ่งนี้:
kill -9 $(jobs -p)
คำตอบที่ยอมรับจะฆ่างานทั้งหมด (ซึ่งเพียงพอในกรณีนี้) และไม่เพียง แต่งานที่หยุด หากคุณต้องการที่จะฆ่าเพียงคนที่หยุดให้เรียกใช้:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
โต้แย้งเกี่ยวกับฟิลเตอร์ตอบรับเพียงคนหยุด
วิธีที่ง่ายที่สุดคือการพยายามออกจากทางออกในทันที bash
จะหมายความว่า "ฆ่างานที่หยุดและออก"
for x in `jobs -p` ; do kill -9 $x ; done
ในกรณีนี้จะช่วยให้คนอื่น - คนส่วนใหญ่อยู่ที่นี่เพราะพวกเขามีกระบวนการหยุดบางอย่างที่พวกเขาเริ่มต้นพื้นหลังผ่านเปลือกอาจ ฉันต้องการค้นหากระบวนการเช่นเดียวกับที่ root หยุดโดยผู้ใช้รายอื่นซึ่งตัวแปรในjobs
คำสั่งจะไม่ทำ
บิตของการขุดไปรอบ ๆ กับman ps
ฉันได้ที่:
ps -a -o pid,user,cmd,state | grep 'T$'
คำอธิบาย: -a
แฟล็กแจ้งว่าแสดงกระบวนการทั้งหมดจากนั้น-o
ควบคุมเอาต์พุตข้อมูลใดที่จะแสดงเกี่ยวกับแต่ละกระบวนการ ฉันเลือกpid
, user
, cmd
(บรรทัดคำสั่ง) และstate
ซึ่งเป็นกระบวนการของรัฐ
จากman ps
:
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
ดังนั้นในที่สุดฉันก็ส่งไปgrep T$
ที่ที่แสดงให้ฉันเห็นกระบวนการทั้งหมดที่มี T ในคอลัมน์สุดท้าย
แล้วฉันมีรายการที่ดีของกระบวนการทั้งหมดจากผู้ใช้ที่แตกต่างกันที่อยู่ในสถานะหยุด
$ ps -a -o pid,user,cmd,state | grep 'T$'
865 joson74+ python T
885 joson74+ sh -c less T
886 joson74+ less T
1014 minames+ python3.4 -i /home/minames T
5352 MooKo nano stdio.h T
7851 harry tmux attach T
12083 harry tmux attach T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d vim T
19664 enythin+ python T
24906 wardlist python T
jobs -ps
นั้นง่ายกว่าคำตอบนี้ คำตอบนี้ไม่แสดงเฉพาะงานที่หยุดทำงานCtrl-Z
ในเชลล์ แต่งานที่หยุดทั้งหมด: เชลล์อื่นผู้ใช้อื่นรวมถึงงานที่กำลังดีบั๊ก (เช่นโดย gdb)
ps -el | grep T
เพื่อค้นหากระบวนการในสถานะ 'T'
หากคุณต้องการลบงานที่หยุดบางงาน แต่ไม่ใช่ทั้งหมดลองทำสิ่งนี้:
ก่อนอื่นทำรายการคุณจะได้รับสิ่งนี้:
$ jobs -l
[2] 4813 Stopped ./parse < call.txt
[3]- 4819 Stopped ./parse < call.txt
ส่ง kill ไปที่งานที่หยุดทำงานมันจะไม่ทำอะไรเลยนอกจากคิวเข้ามาในเบื้องหน้ามันจะยุติ
$ fg %2
./parse < call.txt
Terminated
$ jobs -l
[3]- 4819 Stopped ./parse < call.txt
โดยปกติหากคุณได้รับข้อความนั้นคุณต้องออกจากระบบสองครั้ง เช่นก่อนCtrl+Dให้ข้อความเตือนเพื่อแจ้งให้คุณทราบเกี่ยวกับงานที่หยุดทำงานการกดครั้งที่สองจะทำให้คุณออกจากการฆ่างาน เช่นเดียวกับlogout
และexit
คำสั่ง
หากต้องการฆ่าด้วยตนเองให้ลอง: kill $(jobs -p)
.
หากคุณไม่ต้องการฆ่างานจากเชลล์ปัจจุบันของคุณคุณสามารถลบงานออกจากตารางของงานที่กำลังทำงานอยู่โดยไม่ต้องฆ่าโดยใช้disown
คำสั่ง เช่น
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
งานหยุดนอกจากนี้ยังสามารถกำหนดโดยรัฐของกระบวนการ (ที่T
ตัวอักษร) ซึ่งหมายความว่ากระบวนการหยุดสัญญาณเช่นSIGSTOP
, SIGTSTP
หรืออื่น ๆ (เช่นSIGTTIN
หรือSIGTTOU
)
ในกรณีที่jobs
คำสั่ง shell builtin ไม่พร้อมใช้งานกระบวนการที่หยุดทำงานสามารถแสดงรายการโดยคำสั่งต่อไปนี้:
ps wuax | awk '$8 ~ "T"'
หากต้องการฆ่าพวกเขาทั้งหมดคุณสามารถพิมพ์:
kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')
นี่คือการทดสอบอย่างง่าย:
$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1] Stopped sleep 1000
[2] Stopped sleep 1000
[3] Stopped sleep 1000
[4] Stopped sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
vagrant 2014 0.0 0.0 7228 832 pts/0 T 20:38 0:00 sleep 1000
vagrant 2015 0.0 0.0 7228 708 pts/0 T 20:38 0:00 sleep 1000
vagrant 2016 0.0 0.0 7228 760 pts/0 T 20:38 0:00 sleep 1000
vagrant 2017 0.0 0.0 7228 828 pts/0 T 20:38 0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1] Killed sleep 1000
[2] Killed sleep 1000
[3] Killed sleep 1000
[4] Killed sleep 1000