How do I daemonize an arbitrary script in unix?

Posted by dreeves on Stack Overflow See other posts from Stack Overflow or by dreeves
Published on 2009-02-08T06:11:08Z Indexed on 2010/03/13 6:25 UTC
Read the original article Hit count: 132

Filed under:
|
|
|
|

I'd like a daemonizer that can turn an arbitrary, generic script or command into a daemon.

There are two common cases I'd like to deal with:

  1. I have a script that should run forever. If it ever dies (or on reboot), restart it. Don't let there ever be two copies running at once (detect if a copy is already running and don't launch it in that case).

  2. I have a simple script or command line command that I'd like to keep executing repeatedly forever (with a short pause between runs). Again, don't allow two copies of the script to ever be running at once.

Of course it's trivial to write a "while(true)" loop around the script in case 2 and then apply a solution for case 1, but a more general solution will just solve case 2 directly since that applies to the script in case 1 as well (you may just want a shorter or no pause if the script is not intended to ever die (of course if the script really does never die then the pause doesn't actually matter)).

Note that the solution should not involve, say, adding file-locking code or PID recording to the existing scripts.

More specifically, I'd like a program "daemonize" that I can run like

% daemonize myscript arg1 arg2

or, for example,

% daemonize 'echo `date` >> /tmp/times.txt'

which would keep a growing list of dates appended to times.txt. (Note that if the argument(s) to daemonize is a script that runs forever as in case 1 above, then daemonize will still do the right thing, restarting it when necessary.) I could then put a command like above in my .login and/or cron it hourly or minutely (depending on how worried I was about it dying unexpectedly).

NB: The daemonize script will need to remember the command string it is daemonizing so that if the same command string is daemonized again it does not launch a second copy.

Also, the solution should ideally work on both OS X and linux but solutions for one or the other are welcome.

(If I'm thinking of this all wrong or there are quick-and-dirty partial solutions, I'd love to hear that too.)

© Stack Overflow or respective owner

Related posts about daemon

Related posts about sysadmin