ค้นหา (และฆ่า) กระบวนการเก่า


10

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

นึกคิดฉันต้องการสิ่งที่คล้ายกันเพื่อค้นหา แต่สำหรับกระบวนการ

ระบบคือ Debian linux และนี่จะถูกสคริปต์และทำงานโดย cron ดังนั้นฉันจึงไม่พบปัญหาจริงกับสิ่งที่มีขนาดใหญ่ แต่เข้าใจได้


4
คุณจะแยกความแตกต่างระหว่างกระบวนการที่เก่า แต่สำคัญและกระบวนการที่คุณยินดีจะฆ่าอย่างไร
Chopper3

คำตอบ:


9

คุณสามารถทำได้ด้วยการผสมผสานของ ps, awk และ kill:

ps -eo pid,etime,comm

ให้เอาต์พุตคอลัมน์สามคอลัมน์แก่คุณด้วยกระบวนการ PID เวลาที่ผ่านไปตั้งแต่กระบวนการเริ่มต้นและชื่อคำสั่งโดยไม่มีอาร์กิวเมนต์ เวลาที่ผ่านไปดูเหมือนว่าอย่างใดอย่างหนึ่งต่อไปนี้:

mm:ss
hh:mm:ss
d-hh:mm:ss

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

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

ซึ่งจะพิมพ์รหัสของคำสั่งทั้งหมดที่ตรงกับ 'คำสั่ง' ซึ่งทำงานมานานกว่า 7 วัน ไพพ์รายการนั้นเข้าสู่การฆ่าและคุณทำเสร็จแล้ว:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9

ขอขอบคุณ ลืมเกี่ยวกับตัวเลือกการจัดรูปแบบใน ps โดยสมบูรณ์
Ryaner

2
สิ่งนี้จะไม่แสดงกระบวนการที่คุณใช้งาน "เกิน 7 วัน" มันแสดงให้คุณเห็นกระบวนการทำงานระหว่าง 7 วัน แต่น้อยกว่า 8 วัน
hobodave

etimesมีประโยชน์มากขึ้น - serverfault.com/a/393476/67675
poige

4

killall --quiet --older-than 1w process_name


1
สิ่งนี้ใช้งานได้ดีบน Ubuntu 16.04 และคุณสามารถใช้กับแฟล็ก -i (แบบโต้ตอบ) เพื่อทดสอบและตรวจสอบให้แน่ใจว่ามันกำหนดเป้าหมายกระบวนการที่คุณคิดว่าควรจะเป็น
ezwrighter

1

ข้อมูลทั้งหมดที่คุณต้องการสามารถคว้าps -efได้ ดูคอลัมน์ "STIME" รวมเข้ากับgrepเพื่อเรียงลำดับกระบวนการที่คุณต้องการ ณ จุดที่คุณสามารถใช้cutเพื่อคว้า pid killของทุกกระบวนการที่ตรงกันและผ่านเหล่านั้นไป

โปรดแจ้งให้เราทราบหากคุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำเช่นนี้


ฉันต้องการรายละเอียดเพิ่มเติม คำตอบอื่น ๆ นั้นไม่ถูกต้อง
hobodave

1

หากคุณรูทเพื่อกำจัดขยะ (/ proc / fs proc / stat ... )

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

0

เมื่อกระบวนการเริ่มต้นจะสร้างไดเรกทอรีในระบบไฟล์ / proc คุณสามารถใช้คำสั่ง find เพื่อรับไดเร็กทอรีที่เก่ากว่า 7 วันและฆ่ากระบวนการดังต่อไปนี้:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

มันไม่ทำงานเหมือนกัน เช่นเดียวกับที่มันสร้างคำเตือนนี้และไม่มีเอาต์พุตเพิ่มเติม: find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.การย้าย -maxdepth ให้เป็นเอาต์พุตแรกที่ไม่ส่งคืนโพรเซสและฉันมั่นใจว่าหลาย ๆ คนควรตรงกัน
hobodave

ทำไม mtime ไม่ใช่ ctime ถ้าคุณกำลังมองหาวันที่สร้าง dir? ทางทฤษฎีสามารถแก้ไขได้หากมีการสร้างเด็กเพิ่มเติมซึ่งฉันจะไม่ออกกฎ (บางทีโมดูลเคอร์เนลที่โหลดใหม่จะขยาย sysfs ในทางใดทางหนึ่ง)
jmtd

0

ไม่มีใครพูดถึงps-watcherที่นี่ ฉันคิดว่าคุณอาจเปรียบเทียบ $ start_time โดยใช้ฟังก์ชัน elapsed2sec แต่ฉันไม่แน่ใจทั้งหมด นี่คือความคิดแรกของฉัน:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

ไม่รู้เลยว่ามันใช้งานได้ แต่ควรเป็นจุดเริ่มต้นที่ดี

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