Utility to start daemons, and track whether they run or not. Meant to be used by non-root users.

usage: keepup [-u socketname] [-l logfile] [-sSKrR] <program> [args]
  -l   Store program and keepup output in the file (/dev/null otherwise)
  -u   Unix socket for communication. Otherwise, guessed using <program>
  -s   Ask for status (running/dead)
  -S   Stop the program
  -r   Restart the program
  -R   Start the program only if not started
  -K   Kill keepup for this program
  -f   Daemon that forks


In my crontab, this line ensures the forking daemon dictd is up, and mlnet too:

* * * * * keepup -l ~/keepup.dictd-log -R -f dictd --locale ca_ES.UTF-8 -L ~/dict/dictd.log -c ~/dict/dictd.conf
* * * * * keepup -l ~/mlnet.log -R mlnet

I can check the status of them running, stop them or restart them:

$ keepup -s mlnet     # check status
$ keepup -S mlnet     # stop it, unblocks once stopped (or 3 sec timeout)
$ keepup -s mlnet
$ keepup -r mlnet     # restart it, unblocks once it runs again (or 3 sec timeout)
$ keepup -s mlnet


Only the 'init' process can trace any daemon that forks or double forks, because as the parent dies, init gets it as a child. In linux terms, init is the global child reaper. But the 'init' process is root-owned, and this means the user can touch little of it.

I achieve similar capabilities with 'keepup' using ptrace() on linux. The procees, though, gets under ptrace during all its life, and this does not allow stracing it for example.

Poettering sent a patch for linux to allow changing the child reaper, but as of linux 3.2.7, it is not upstream still.

Similar work

I think systemd has per-user kind of init scripts, I don't know if only under a kernel with the patch from Poettering above.