in reply to Script for Killing Process of Long Running Time in Linux/Unix

Another possible solution, since you mentioned the system() call, is to make it a one liner,
ps -lf | grep "user" | perl -ane '($h,$m,$s) = split /:/,$F[13]; kill + 9, $F[3] if ($h > 1);'

You can change the criteria for killing the process, but in this case I pick any with a TIME greater than 1 hour.

Though, this will be dependent on the particulars of the 'ps' command on your flavor of unix, most notably whether it's a BSD or SySV flavor. BSD has the -u option to select only those processes for a user, but the other does not which is why I typically just use grep "username".

If your particular ps is different, you'll only have to change the indexes into @F. In the above case, the TIME is at index 13 in the format "00:00:00" and the PID of the process is index 3 and is just an integer.

Replies are listed 'Best First'.
Re^2: Script for Killing Process of Long Running Time in Linux/Unix
by monkfan (Curate) on Oct 26, 2007 at 08:46 UTC
    Thanks so much. That's just what we need.
    BTW do you know how can I put that one-liner in CRONTAB?
    $ crontab -e

    Regards,
    Edward
      You can put it in crontab directly (everything after the first five fields is considered the command),
      * * * * * ps -lf | grep "user" | perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1);'
      or, wrap it in a shell script and call the shell script from your crontab entry instead.
      #!/bin/sh # longprockill.sh ps -lf | grep "user" | perl -ane '($h,$m,$s) = split /:/,$F[13]; kill + 9, $F[3] if ($h > 1);'
      And call it crontab like so,
      * * * * * longprockill.sh

      ---
      echo S 1 [ Y V U | perl -ane 'print reverse map { $_ = chr(ord($_)-1) } @F;'

        If you wanted to changed this script to kill a process that has been running greater then 5 min. how youd you change the script. i.e. a java process running greater then 5 minutes user is usually applmgr Thank you