Friday, January 28, 2011

Find (and kill) old processes

Basically I need to be able scan the process tree and find processes that match a certain name and started running more than a week a go. Once I have them, I need to kill them. All the processes are still seen as in a running state by the system, just not using any system time. They'll usually sit forever in this state too.

Ideally I'd like something similar to find, but for processes.

System is Debian linux and this will be scripted and run by cron so I've no real issues with something large but understandable.

  • All the info you need can be grabbed from ps -ef. See the "STIME" column. Combine that with grep to sort out the processes you need. At that point, you can use cut to grab the pid of all the matching processes and pass those to kill.

    Please let me know if you'd like more details on how to do this.

    hobodave : I would like more details. The other answers are simply incorrect.
    From ErikA
  • When a process starts up, it creates a directory in the /proc filesystem. You can use the find command to get directories older than 7 days and kill the processes as follows:

    find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9
    
    hobodave : This doesn't work either. As-is it generates this warning, and no additional output: `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.` Moving -maxdepth to be the first output it returns no processes, and I am positive that many should match.
    From dogbane
  • YOu can do this with a combination of ps , awk and kill:

    ps -eo pid,etime,comm
    

    Gives you a three column output, with the process PID, the elapsed time since the process started, and the command name, without arguments. The elapsed time looks like one of these:

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

    Since you want processes that have been running for more than a week, you would look for lines matching that third pattern. You can use awk to filter out the processes by running time and by command name, like this:

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

    which will print the pids of all commands matching 'mycommand' which have been running for more than 7 days. Pipe that list into kill, and you're done:

    ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
    
    Ryaner : Nice one thanks. Completely forgot about the formatting options in ps.
    hobodave : This doesn't show you processes running "more than 7 days". It shows you processes running between 7 days but less than 8 days.
  • if you're root, to get rid of trash ( /proc/fs proc/stat ...)

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

0 comments:

Post a Comment