As a way to build a poor-man's watchdog and make sure an application is restarted in case it crashes (until I figure out why), I need to write a PHP CLI script that will be run by cron every 5mn to check whether the process is still running.
Based on this page, I tried the following code, but it always returns True even if I call it with bogus data:
function processExists($file = false) { $exists= false; $file= $file ? $file : __FILE__; // Check if file is in process list exec("ps -C $file -o pid=", $pids); if (count($pids) > 1) { $exists = true; } return $exists; } #if(processExists("lighttpd")) if(processExists("dummy")) print("Exists\n") else print("Doesn't exist\n");
Next, I tried this code...
(exec("ps -A | grep -i 'lighttpd -D' | grep -v grep", $output);) print $output;
... but don't get what I expect:
/tmp> ./mycron.phpcli Arrayroot:/tmp>
FWIW, this script is run with the CLI version of PHP 5.2.5, and the OS is uClinux 2.6.19.3.
Thank you for any hint.
Edit: This seems to work fine
exec("ps aux | grep -i 'lighttpd -D' | grep -v grep", $pids); if(empty($pids)) { print "Lighttpd not running!\n"; } else { print "Lighttpd OK\n"; }
Bash commands to check running process: pgrep command – Looks through the currently running bash processes on Linux and lists the process IDs (PID) on screen. pidof command – Find the process ID of a running program on Linux or Unix-like system.
The easiest way to find out if process is running is run ps aux command and grep process name. If you got output along with process name/pid, your process is running.
You can list running processes using the ps command (ps means process status). The ps command displays your currently running processes in real-time.
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)...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With