How do I kill processes older than "t"?
Solution 1:
GNU Killall can kill processes older than a given age, using their processname.
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
Solution 2:
Thanks to Christopher's answer I was able to adapt it to the following:
find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
-mmin
was the find command I was missing.
Solution 3:
find doesnt always work, not every system has etimes available, and it might be my regex newb status, but I dont think you need anything more than this:
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- list all processes and provide columns PID,ELAPSED(etimes = seconds), COMMAND, USER, TT (thanks @ahoffman)
- with awk print the PID where the 4th column ($4, USER) contains text 'builder', and 5th column ($5, TT) contains text 'pts' and the ELAPSED column has a value larger than 600 sec (thanks @amtd)
you can then pipe that to kill or whatever your need may be.
Solution 4:
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes | awk '{if ($2 >= 3600) print $2}'
If you want you can feed ps
with list of PIDs to lookup within, for e. g.:
ps h -O etimes 1 2 3
Solution 5:
I think you can modify some of those previous answers to fit your needs. Namely:
for FILE in (find . -maxdepth 1 -user processuser -type d -mmin +60) do kill -9 $(basename $FILE) # I can never get basename to work with find's exec. Let me know if you know how! done
Or
ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9
I think the second may best fit your needs. The find version would wind up nuking other processes by that user
--Christopher Karel