Sponsored Content
Top Forums Shell Programming and Scripting Finding the age of a unix process, killing old processes, killing zombie processes Post 302412948 by sukerman on Wednesday 14th of April 2010 04:48:15 AM
Old 04-14-2010
Finding the age of a unix process, killing old processes, killing zombie processes

I had issues with processes locking up. This script checks for processes and kills them if they are older than a certain time.

Its uses some functions you'll need to define or remove, like slog() which I use for logging, and is_running() which checks if this script is already running so you can add it to cron without running multiple copies.

Hope this helps someone ;-)

Jack.

Code:
#!/usr/bin/php
<?
    if (is_running()) die();

    slog("monitor started",2);

    while(true){
        check_process("convert"); // kill convert processes over 5 minutes old (default)
        check_process("bash",1440); // kill bash processes over 1440 minutes old
        check_process("qmail-smtpd",30); // kill qmail-smtpd processes over 30 minutes old
        sleep(300);
    }

    function cmd($cmd){
        $fp = popen($cmd, 'r');
        $ret="";
        while ($read = fread($fp, 2096)) $ret = $ret.$read;
        pclose($fp);
        return $ret;
    }
    function kill_pid($pid){
        slog("kill_pid: killing [$pid]",2);
        posix_kill($pid,1);
    }
    function check_process($cmd,$max_runtime=5) {
        $now = getdate();
        $h = $now['hours'];
        $m = $now['minutes'];
        $nowtime = ($h*3600)+($m*60);
        $x = cmd("ps h -fC $cmd");
        if ($x){
            $x = explode("\n",$x);
            foreach($x as $l){
                if ($l){
                    while (strstr($l,"  ")) $l = str_replace("  "," ",$l);
                    list($owner,$pid,$ppid,$c,$stime,$tty,$s,$time,$cmd) = explode(" ",$l);
                    if (!strstr($stime,":")) {
                        slog("check_process: $cmd : STIME [$stime] - more than a day old",2);
                        kill_pid($pid);
                    } else {
                        slog("check_process: $cmd : check runtime");
                        list($sh,$sm) = explode(":",$stime);
                        $runtime = ($sh*3600)+($sm*60);
                        $diff = ($nowtime - $runtime)/60;
                        if ($diff>$max_runtime){
                            slog("check_process: $cmd : STIME [$stime] now [$h:$m] - over $max_runtime minutes since start",2);
                            kill_pid($pid);
                        } else slog("check_process: $cmd : STIME [$stime] now [$h:$m] - running $diff/$max_runtime minutes",2);
                    }
                }
            }
        } else slog("check_process: $cmd : no processes",2);
    }
?>


Last edited by sukerman; 04-14-2010 at 06:10 AM.. Reason: Added script shebang incase you didn't realise its php
 

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Killing idle user processes

I'm looking for some help, please! I'm trying to kill any idle user processes over 40 Minutes. I have tried putting TMOUT=2400 within the users .profile However this does not seem to be working. We run aix 4.3.3 with ORACLE 7.3 The above works o.k. when the user is only within the... (3 Replies)
Discussion started by: annette
3 Replies

2. Shell Programming and Scripting

Killing processes in scripts

I have a small problem. It's annoying though. I wrote this shell script: # # This script will accept two arguments. The first is a flag and the # second is a time interval. The only valid flag is '-t' which means # the user will specify the interval in seconds, otherwise the # default is 600... (3 Replies)
Discussion started by: el_toro
3 Replies

3. Solaris

killing all processes for an user

how can I kill all the processes belonging to an user. I need it because I can't see a process initiated by a user and thus unable to kill it. (2 Replies)
Discussion started by: krishan
2 Replies

4. UNIX for Dummies Questions & Answers

forking and killing parent processes

Hi everybody, I'm having some problems wiriting a program in UNIX using the "fork" and "kill" system calls. I have to create a C program P0, which creates 9 other processes P1, P2, ..., P9, where P0 is the father of P1, P1 the father of P2, and so on. All the processes contain an infinite... (0 Replies)
Discussion started by: davewilliams20
0 Replies

5. Shell Programming and Scripting

killing cascade processes

Hi everybody!! I've got a problem. I have a loop like this: while true; do some_work sleep 10m done It's possible to kill the main loop process and kill all childs from it? I want to kill main process and kill the sleep also. I tried kill -9 <loop_pid> with no result ... (4 Replies)
Discussion started by: victorin
4 Replies

6. UNIX for Advanced & Expert Users

Monitoring Processes - Killing hung processes

Is there a way to monitor certain processes and if they hang too long to kill them, but certain scripts which are expected to take a long time to let them go? Thank you Richard (4 Replies)
Discussion started by: ukndoit
4 Replies

7. UNIX for Advanced & Expert Users

killing all child processes

Hi, Is there a way I can kill all the child processes of a process, given its process id. Many thanks in advance. J. (1 Reply)
Discussion started by: superuser84
1 Replies

8. HP-UX

OSF/1 swap file low and killing processes!

Hi, Hoping someone may be able to help with some general guidance. Hope I've posted this in the right forum! I hava DEC Workstation running OSF/1. It's will run for a period of time then slow down to the point it becomes unusable. Then i have to reboot and the whole thing repeats. I... (1 Reply)
Discussion started by: emeak
1 Replies

9. Solaris

Killing a zombie process[PRD]

Dear All, I have checked so many post about killing Zombie process. Most of the cases, everyone suggested to "reboot" the system, as "kill -9/-15 zombie" may not work! My concern is: If the system is a Production server then what to do? Regards, Sapy. (6 Replies)
Discussion started by: saps19
6 Replies

10. Shell Programming and Scripting

killing serious of processes in the server

i am new to unix..i have requirement to kill informatica server process. when i used the below query pidoff "pmserver" it displayed 3 process running.. i need to get the 3 process and kill individual process in shell script. Can you please assit me in this. (2 Replies)
Discussion started by: hkoshekay
2 Replies
KILLALL(1)							   User Commands							KILLALL(1)

NAME
killall - kill processes by name SYNOPSIS
killall [-Z, --context pattern] [-e, --exact] [-g, --process-group] [-i, --interactive] [-n, --ns PID] [-o, --older-than TIME] [-q, --quiet] [-r, --regexp] [-s, --signal SIGNAL, -SIGNAL] [-u, --user user] [-v, --verbose] [-w, --wait] [-y, --younger-than TIME] [-I, --ignore-case] [-V, --version] [--] name ... killall -l killall -V, --version DESCRIPTION
killall sends a signal to all processes running any of the specified commands. If no signal name is specified, SIGTERM is sent. Signals can be specified either by name (e.g. -HUP or -SIGHUP) or by number (e.g. -1) or by option -s. If the command name is not regular expression (option -r) and contains a slash (/), processes executing that particular file will be selected for killing, independent of their name. killall returns a zero return code if at least one process has been killed for each listed command, or no commands were listed and at least one process matched the -u and -Z search criteria. killall returns non-zero otherwise. A killall process never kills itself (but may kill other killall processes). OPTIONS
-e, --exact Require an exact match for very long names. If a command name is longer than 15 characters, the full name may be unavailable (i.e. it is swapped out). In this case, killall will kill everything that matches within the first 15 characters. With -e, such entries are skipped. killall prints a message for each skipped entry if -v is specified in addition to -e, -I, --ignore-case Do case insensitive process name match. -g, --process-group Kill the process group to which the process belongs. The kill signal is only sent once per group, even if multiple processes belonging to the same process group were found. -i, --interactive Interactively ask for confirmation before killing. -l, --list List all known signal names. -n, --ns Match against the PID namespace of the given PID. Use 0 to match against all namespaces. The default is to match against the current PID namespace. -o, --older-than Match only processes that are older (started before) the time specified. The time is specified as a float then a unit. The units are s,m,h,d,w,M,y for seconds, minutes, hours, days, weeks, Months and years respectively. -q, --quiet Do not complain if no processes were killed. -r, --regexp Interpret process name pattern as a POSIX extended regular expression, per regex(3). -s, --signal, -SIGNAL Send this signal instead of SIGTERM. -u, --user Kill only processes the specified user owns. Command names are optional. -v, --verbose Report if the signal was successfully sent. -V, --version Display version information. -w, --wait Wait for all killed processes to die. killall checks once per second if any of the killed processes still exist and only returns if none are left. Note that killall may wait forever if the signal was ignored, had no effect, or if the process stays in zombie state. -y, --younger-than Match only processes that are younger (started after) the time specified. The time is specified as a float then a unit. The units are s,m,h,d,w,M,y for seconds, minutes, hours, days, weeks, Months and years respectively. -Z, --context (SELinux Only) Specify security context: kill only processes having security context that match with given extended regular expres- sion pattern. Must precede other arguments on the command line. Command names are optional. FILES
/proc location of the proc file system KNOWN BUGS
Killing by file only works for executables that are kept open during execution, i.e. impure executables can't be killed this way. Be warned that typing killall name may not have the desired effect on non-Linux systems, especially when done by a privileged user. killall -w doesn't detect if a process disappears and is replaced by a new process with the same PID between scans. If processes change their name, killall may not be able to match them correctly. killall has a limit of names that can be specified on the command line. This figure is the size of an unsigned long multiplied by 8. For most 32 bit systems the limit is 32 and similarly for a 64 bit system the limit is usually 64. SEE ALSO
kill(1), fuser(1), pgrep(1), pidof(1), pkill(1), ps(1), kill(2), regex(3). psmisc 2017-06-12 KILLALL(1)
All times are GMT -4. The time now is 11:37 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy