davidmytton
davidmytton

Reputation: 39264

How can I check a file exists and execute a command if not?

I have a daemon I have written using Python. When it is running, it has a PID file located at /tmp/filename.pid. If the daemon isn't running then PID file doesn't exist.

On Linux, how can I check to ensure that the PID file exists and if not, execute a command to restart it?

The command would be

python daemon.py restart

which has to be executed from a specific directory.

Upvotes: 42

Views: 69674

Answers (7)

gahooa
gahooa

Reputation: 137302

Another approach to solving the problem is a script that ensures that your daemon "stays" alive...

Something like this (note: signal handling should be added for proper startup/shutdown):

$PIDFILE = "/path/to/pidfile"

if [ -f "$PIDFILE" ]; then
    echo "Pid file exists!"
    exit 1
fi

while true; do
    # Write it's own pid file
    python your-server.py ;

    # force removal of pid in case of unexpected death.
    rm -f $PIDFILE;

    # sleep for 2 seconds
    sleep 2;

done

In this way, the server will stay alive even if it dies unexpectedly.

Upvotes: 5

harveyD
harveyD

Reputation: 589

test -f filename && daemon.py restart || echo "File doesn't exists"

Upvotes: 19

Brimstedt
Brimstedt

Reputation: 3140

If it is bash scripting you are wondering about, something like this would work:

if [ ! -f "$FILENAME" ]; then
   python daemon.py restart
fi

A better option may be to look into lockfile

Upvotes: 11

KBIIX
KBIIX

Reputation: 911

ls /tmp/filename.pid

It returns true if file exists. Returns false if file does not exist.

Upvotes: 1

Anonymous
Anonymous

Reputation: 3051

You can also use a ready solution like Monit.

Upvotes: 1

eduffy
eduffy

Reputation: 40224

[ -f /tmp/filename.pid ] || python daemon.py restart

-f checks if the given path exists and is a regular file (just -e checks if the path exists)

the [] perform the test and returns 0 on success, 1 otherwise

the || is a C-like or, so if the command on the left fails, execute the command on the right.

So the final statement says, if /tmp/filename.pid does NOT exist then start the daemon.

Upvotes: 87

Douglas Leeder
Douglas Leeder

Reputation: 53310

The other answers are fine for detecting the existence of the file. However for a complete solution you probably should check that the PID in the pidfile is still running, and that it's your program.

Upvotes: 6

Related Questions