Search code examples
phpcronbackground-processdaemonakeneo

How can I check if a program is running in the background using a cron, and start it if needed?


I have the task to run a daemon in the background on a production server. However, I do want to be sure that this daemon always runs. The daemon is PHP process.

I tried to approach this by checking if the daemon is running, and if not: start it. So I have a command like:

if [ $(ps ax | grep -c "akeneo:batch:job-queue-consumer-daemon") -lt 3 ]; then php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon & fi

I first do an if with ps and grep -c to check if there are processes running with a given name, and if not: I start the command ending with an &, forcing it to start.

The above command works, if I execute it from the command line the process gets started and I can see that is is running when I execute a simple ps ax-command.

However, as soon as I try to do this using the crontab it doesn't get started:

* * * * * if [ $(ps ax | grep -c "akeneo:batch:job-queue-consumer-daemon") -lt 3 ]; then php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon & fi

I also set the MAILTO-header in the crontab, but I'm not getting any e-mails as well.

Can anyone tell me what's wrong with my approach? And how I can get it started?


Solution

  • An easy and old-style one is to create a bash file where you basically check if the process is running, otherwise you start it.

    Here the content of the bash file:

    #!/bin/bash
    
    if [ $(ps -efa | grep -v grep | grep job-queue-consumer-daemon -c) -gt 0 ] ;
    then
        echo "Process running ...";
    else
        php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon
    fi;
    

    Then in the crontab file you run the bash file.