Checking if process still running?
If you're doing it in php, why not use php code:
In the running program:
define('PIDFILE', '/var/run/myfile.pid');file_put_contents(PIDFILE, posix_getpid());function removePidFile() { unlink(PIDFILE);}register_shutdown_function('removePidFile');
Then, in the watchdog program, all you need to do is:
function isProcessRunning($pidFile = '/var/run/myfile.pid') { if (!file_exists($pidFile) || !is_file($pidFile)) return false; $pid = file_get_contents($pidFile); return posix_kill($pid, 0);}
Basically, posix_kill has a special signal 0
that doesn't actually send a signal to the process, but it does check to see if a signal can be sent (the process is actually running).
And yes, I do use this quite often when I need long running (or at least watchable) php processes. Typically I write init scripts to start the PHP program, and then have a cron watchdog to check hourly to see if it's running (and if not restart it)...
I'd use pgrep
to do this (caution, untested code):
exec("pgrep lighttpd", $pids);if(empty($pids)) { // lighttpd is not running!}
I have a bash script that does something similar (but with SSH tunnels):
#!/bin/shMYSQL_TUNNEL="ssh -f -N -L 33060:127.0.0.1:3306 tunnel@db"RSYNC_TUNNEL="ssh -f -N -L 8730:127.0.0.1:873 tunnel@db"# MYSQLif [ -z `pgrep -f -x "$MYSQL_TUNNEL"` ] then echo Creating tunnel for MySQL. $MYSQL_TUNNELfi# RSYNCif [ -z `pgrep -f -x "$RSYNC_TUNNEL"` ]then echo Creating tunnel for rsync. $RSYNC_TUNNELfi
You could alter this script with the commands that you want to monitor.
You can try this, which combines bits of those two approaches:
function processExists($processName) { $exists= false; exec("ps -A | grep -i $processName | grep -v grep", $pids); if (count($pids) > 0) { $exists = true; } return $exists;}
If that doesn't work, you may want to just try running the ps command on your system and seeing what output it gives.