จะฆ่าได้ถ้ากระบวนการกำลังทำงานอยู่เท่านั้น?


14

ขณะนี้ฉันใช้บรรทัดเช่นนี้ในไฟล์สคริปต์ sh ของฉัน:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

แต่ฉันสงสัยว่าจะเรียกใช้เฉพาะเมื่อกระบวนการ ( myServerที่นี่) กำลังทำงานอยู่หรือไม่


มันเป็นไปไม่ได้ที่จะเรียกkillเฉพาะเมื่อกระบวนการทำงานเนื่องจากมีการแย่งชิงระหว่างการทดสอบและการภาวนาของkill(มันเป็นไปได้ที่กระบวนการหยุดด้วยเหตุผลในช่วงเวลาสั้น ๆ ที่ว่าคนอื่น) คุณควรใช้pkillหรือkillallสิ่งใดที่เหมือนกับสิ่งที่คุณพยายามทำ แต่มีน้อยกว่าที่จะพิมพ์ (และอาจมีข้อได้เปรียบอื่น ๆ ด้วย)
JanC

คำตอบ:


20

ฉันมักจะใช้ pgrep และ pkill

if pgrep myServer; then pkill myServer; fi

7
ทำไมไม่pkill myServerหรือkillall -q myServer? ไม่มีข้อเสียในการพยายามฆ่ากระบวนการที่ไม่มีอยู่
David Foerster

12
จะไม่ออกจาก 0 หากไม่มีกระบวนการที่จะฆ่าดังนั้นจึงอาจทำให้สคริปต์แตกได้
boutch55555

6
ผนวก|| trueแล้ว
David Foerster

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

เกี่ยวกับif ! killall -q myServer; then echo ERROR; fiอะไร
David Foerster

9

คุณสามารถฆ่ากระบวนการโดยใช้ชื่อpkillหรือkillallตรวจสอบหน้าคนของพวกเขา


ใช่แตกต่างจากkillนี้จะฆ่าเฉพาะในกรณีที่กระบวนการทำงาน ตัวอย่างเช่นpkill -u myuser -f myprocess\.[0-9]+
Chase T.

6

แนวทางที่แตกต่างเล็กน้อยจะเป็นดังนี้:

killall PROCESS || echo "Process was not running."

สิ่งนี้จะหลีกเลี่ยง1Error-Code ที่ส่งคืนจากkillallคำสั่งหากกระบวนการไม่มีอยู่ echoเพียงส่วนหนึ่งจะเข้ามาในการดำเนินการหากkillallผลตอบแทน1ในขณะที่ตัวเองจะกลับมา0(ความสำเร็จ)


5
ใช้killall -qดีกว่า
Anwar

1
คำเตือนkillall -qไม่รองรับรสชาติ unix ทั้งหมด macOS Catalina ยังไม่มีอยู่
tresf

0

ลองใช้:

sudo kill `pidof process_name`

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

แจ้งให้เราทราบหากสิ่งนี้ช่วยได้


เกิดอะไรขึ้นถ้ารายการว่างเปล่า (จุดประสงค์หลักของฉันคือไม่ต้องเรียกการฆ่าเลยถ้าเป็นไปได้)
myWallJSON

1
หากรายการว่างเปล่าฆ่าจะส่งกลับรหัสข้อผิดพลาด 1 และไม่ฆ่าอะไร มันจะเทียบเท่ากับการพยายามเรียกฆ่าโดยไม่มีข้อโต้แย้ง คุณสามารถเพิ่มคำสั่ง if ที่ตรวจสอบก่อนว่า pidof ส่งคืนรายการว่างหรือไม่ kill `pidof process_nameถ้ามันไม่ได้กลับรายการที่ว่างเปล่าโทร หากส่งคืนรายการว่างให้ข้ามการเรียก kill
amandion

0

สคริปต์เล็ก ๆ ที่ฉันสร้างขึ้นด้วย R&D ฉันหวังว่าคุณจะชอบมัน

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

บันทึกด้วยชื่อเช่น script.sh แล้ว

chmod +x script.sh
./script.sh

จากนั้นให้ชื่อกระบวนการของคุณ

หมายเหตุ: ฉันได้ลองมาหลายครั้งแล้วและใช้งานได้ดี


ฉันขอทราบว่ามีความผิดปกติกับสคริปต์นี้หรือไม่
rɑːdʒɑ

ไม่มีอะไรผิดปกติกับสคริปต์นี้ ... +1
WinEunuuchs2Unix

0

pidofตรวจสอบว่ากระบวนการที่มีอยู่ด้วย ถ้าเป็นเช่นนั้นให้ฆ่ามัน

(! pidof process_name) || sudo kill -9 $(pidof process_name)

รหัสการออกเป็น 0 เสมอหลังจากรันคำสั่งข้างต้น


0

ใช้pkillกับตัวเลือก-f

pkill -f myServer

ตัวเลือก-fเป็นรูปแบบที่ปกติจะจับคู่กับชื่อกระบวนการ


-1

ฉันจะใช้:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

การxargs -rบอกให้รัน kill เฉพาะเมื่อมีอินพุต ps --no-header -eo pid,cmdได้รับการส่งออกในรูปแบบที่ดีกว่าสำหรับการแยก

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