Differences between revisions 2 and 10 (spanning 8 versions)
Revision 2 as of 2007-11-30 03:02:35
Size: 1143
Editor: GreyCat
Comment: change internal link
Revision 10 as of 2012-10-27 10:38:13
Size: 2244
Editor: a88-114-128-29
Comment: Corrected ambiguos phrasing.
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
[[Anchor(faq42)]] <<Anchor(faq42)>>
Line 5: Line 5:
 {{{
 myprog & # Start program in the background
 daemonpid=$! # ...and save its process id
{{{
# Bourne
myprog & # Start program in the background
daemonpid=$! # ...and save its process id
Line 9: Line 10:
 while sleep 60
 do
 
if kill -0 $daemonpid # Is the process still alive?
     then
 
echo >&2 "OK - process is still running"
     else
 
echo >&2 "ERROR - process $daemonpid is no longer running!"
         break
     fi
 done}}}
while sleep 60
do
if kill -0 $daemonpid # Is the process still alive?
    then
echo >&2 "OK - process is still running"
    else
echo >&2 "ERROR - process $daemonpid is no longer running!"
        break
    fi
done}}}
Line 20: Line 21:
This is one of those questions that usually masks a much deeper issue. It's rare that someone wants to know whether a process is still running simply to display a red or green light to an operator. More often, there's some ulterior motive, such as the desire to ensure that some daemon which is known to crash frequently is still running, or to ensure mutually exclusive access to a resource, etc. For much better discussion of these issues, see ProcessManagement or [:BashFAQ#faq33:FAQ #33]. '''NOTE''': Anything you do that relies on PIDs to identify a process is inherently flawed. If a process dies, the meaning of its PID is UNDEFINED. Another process started afterward may take the same PID as the dead process. That would make the previous example think that the process is still alive (its PID exists!) even though it is dead and gone. It is for this reason that nobody other than the parent of a process should try to manage the process. Read ProcessManagement.

This is one of those questions that usually masks a much deeper issue. It's rare that someone wants to know whether a process is still running simply to display a red or green light to an operator.

More often, there's some ulterior motive, such as the desire to ensure that some daemon which is known to crash frequently is still running. If this is the case, the best course of action is to ''fix the program or its configuration'' so that it stops crashing. If you can't do that, then just restart it when it dies:

{{{
# POSIX
while true
do
  myprog && break
  sleep 1
done
}}}

This piece of code will restart `myprog` if it terminates with an exit code other than 0 (indicating something went wrong). If the exit code is 0 (successfully shut down) the loop ends. (If your process is crashing but also returning exit status 0, then adjust the code accordingly.) Note that `myprog` must run in the foreground. If it automatically "daemonizes" itself, you are screwed.

For a much better discussion of these issues, see ProcessManagement or [[BashFAQ/033|FAQ #33]].

----
CategoryShell

How can I find out if a process is still running?

The kill command is used to send signals to a running process. As a convenience function, the signal "0", which does not exist, can be used to find out if a process is still running:

# Bourne
myprog &          # Start program in the background
daemonpid=$!      # ...and save its process id

while sleep 60
do
    if kill -0 $daemonpid       # Is the process still alive?
    then
        echo >&2 "OK - process is still running"
    else
        echo >&2 "ERROR - process $daemonpid is no longer running!"
        break
    fi
done

NOTE: Anything you do that relies on PIDs to identify a process is inherently flawed. If a process dies, the meaning of its PID is UNDEFINED. Another process started afterward may take the same PID as the dead process. That would make the previous example think that the process is still alive (its PID exists!) even though it is dead and gone. It is for this reason that nobody other than the parent of a process should try to manage the process. Read ProcessManagement.

This is one of those questions that usually masks a much deeper issue. It's rare that someone wants to know whether a process is still running simply to display a red or green light to an operator.

More often, there's some ulterior motive, such as the desire to ensure that some daemon which is known to crash frequently is still running. If this is the case, the best course of action is to fix the program or its configuration so that it stops crashing. If you can't do that, then just restart it when it dies:

# POSIX
while true
do
  myprog && break
  sleep 1
done

This piece of code will restart myprog if it terminates with an exit code other than 0 (indicating something went wrong). If the exit code is 0 (successfully shut down) the loop ends. (If your process is crashing but also returning exit status 0, then adjust the code accordingly.) Note that myprog must run in the foreground. If it automatically "daemonizes" itself, you are screwed.

For a much better discussion of these issues, see ProcessManagement or FAQ #33.


CategoryShell

BashFAQ/042 (last edited 2012-10-27 10:38:13 by a88-114-128-29)