Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking if process still running?

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"; } 
like image 285
Gulbahar Avatar asked Jun 24 '10 15:06

Gulbahar


People also ask

How do you check if the process is running?

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.

How can I tell if a process ID is running?

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.

How do you check if a process is still running in Linux?

You can list running processes using the ps command (ps means process status). The ps command displays your currently running processes in real-time.


1 Answers

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)...

like image 187
ircmaxell Avatar answered Sep 23 '22 14:09

ircmaxell