วิธีการฆ่าอย่างงดงาม


12

หลังจากสคริปต์ทุบตีของฉันทำกับเซิร์ฟเวอร์ซีลีเนียมแล้วสคริปต์ก็จะฆ่าแบบนี้:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

ในขณะที่มันใช้งานได้และมันจะฆ่าสคริปต์ซีลีเนียมมันก็พยายามที่จะฆ่ากระบวนการสำหรับgrep seleniumดังนั้นตามเวลาที่หมายเลขกระบวนการกลับไปที่คำสั่ง kill กระบวนการจะหายไปดังนั้นจึงสิ้นสุดการสร้างข้อความแสดงข้อผิดพลาด (ในคำอื่น ๆ : มันจบลงด้วยการฆ่าสองกระบวนการหนึ่งในนั้นคือเซิร์ฟเวอร์ซีลีเนียมจริงอีกกระบวนการหนึ่งเป็นกระบวนการที่หายวับไปซึ่งเป็นผลข้างเคียงของวิธีที่ฉันทำตามคำสั่งนี้)

มีวิธีที่สง่างามกว่าในการฆ่ากระบวนการที่ไม่มีผลข้างเคียงนี้หรือไม่?

(FWIW หนึ่งความคิดที่ฉันมี: สคริปต์เดียวกันนี้เริ่มต้นขึ้นในซีลีเนียมก่อนหน้านี้ในสคริปต์ดังนั้นอาจจะมีวิธีที่ฉันสามารถจับ PID ได้เมื่อฉันเริ่มต้นซีลีเนียมฉันสามารถเก็บมันไว้และฆ่ามันโดยตรงแทนที่จะเป็น grepping ID กระบวนการปัญหาคือฉันไม่รู้วิธีรับ PID นั้นวิธีใช้ตัวแปรเพื่อเก็บมันและวิธีอ้างอิงในสคริปต์ในภายหลัง แต่วิธีนี้เป็นวิธีที่ดีกว่าหรือไม่)

คำตอบ:


12

พยายามที่จะใช้pkill seleniumถ้าไม่นี้หรือหนึ่งในงานอื่น ๆ ที่คุณสามารถใช้วิธีการของคุณกับลำดับท่ออื่นเช่น

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

pkill ไม่ทำงานบนเซิร์ฟเวอร์ของฉันสำหรับเรื่องนี้ แต่แถบ grep ที่ปรับปรุงใหม่ของคุณช่วยได้มาก
Eric

20

ลองใช้pgrepคำสั่งซึ่งจะส่งออก PID ของคำสั่งที่คุณสนใจ

pgrep selenium

หากต้องการฆ่ากระบวนการให้ใช้pkillคำสั่งสหาย

pkill selenium

ฉันชอบความสง่างามของสิ่งนี้ แต่กระบวนการมีลักษณะดังนี้: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0 jar "ดังนั้นฉันเพิ่งเปลี่ยนมันpgrep javaและมันใช้งานได้ :-) ขอบคุณ!
Eric

2
หากคุณให้ pgrep กับแฟล็ก '-f' มันจะจับคู่รูปแบบกับบรรทัดคำสั่งทั้งหมด ดังนั้นในกรณีนี้การฆ่าpgrep -f seleniumควรใช้งานได้
mills013

7
การใช้pkillนั้นง่ายกว่ามาก pkillใช้เกณฑ์การจับคู่ที่แน่นอนเหมือนกันpgrepดังนั้นคุณสามารถทำสิ่งนี้ได้ใน 1 คำสั่งแทน 2 (และต้องพึ่งพาผลลัพธ์ของหนึ่ง)
Patrick

7

ลองใช้grep [s]eleniumดู นี่จะไม่พบกระบวนการ grep


นี่เป็นกลอุบายที่มีประโยชน์แน่นอน ทำไมมันทำงาน

2
@hesse - grepใช้ BREs เป็นค่าเริ่มต้น นั่นคือ[และ]แสดงในargvสำหรับgrepแต่มันไม่ตรงเพราะ[และไม่ได้ถูกนำมาใช้อย่างแท้จริงโดย] grep
Chris Down

ฉันมักจะใช้| grep -v grepส่วนประกอบในท่อ แต่นี่มันสวยและฉันชอบมันมาก!
Alexios

นี่คือ (มักจะ) ไม่เพียงพอหากคุณมีไฟล์ในไดเรกทอรีการทำงานปัจจุบันที่มีชื่อเดียวกับกระบวนการที่คุณต้องการ ps -ef | grep \[s]eleniumดังนั้นการแก้ปัญหาผมปกติใช้เป็น: แม้ว่าผมพบว่าlsofจะเป็นทางเลือกที่ดีมากที่จะใช้และps grep
Moreaki

2

killallคำสั่งยังไม่ได้รับการกล่าวถึงและผมรู้สึกว่ามันเป็นยังมีประโยชน์ในการละคร

$ killall selenium

คุณยังสามารถใช้-r regexตัวเลือกเพื่อระบุนิพจน์ทั่วไปให้ตรงกับชื่อกระบวนการและแม้แต่ค่าเวลา:

$ killall -o 5m selenium 

ฆ่ากระบวนการซีลีเนียมทั้งหมดที่เก่ากว่า 5 นาที


ที่ดูเหมือนจะไม่ซ้ำกับรุ่นที่ไม่ใช่ RHEL / CentOS ของkillall
ewwhite

0

ใช้-m 1สวิตช์พร้อมกับคำสั่ง grep เพื่อดึงข้อมูลเฉพาะกระบวนการที่พบครั้งแรกเท่านั้น ตราบใดที่คุณเรียงลำดับโพรเซสของคุณด้วย PID แล้วก็จะได้ผล


1
คุณไม่สามารถแน่ใจได้ว่ากระบวนการซีลีเนียมใช้ PID ที่ต่ำกว่า
FJRA

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