Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is there a way for me to tell cron to run an app BUT not run it if a process exist already?

share|improve this question
Would you clarify whether the app should not run if it is already running, or if a different process is already running. Thanks – Linker3000 Feb 10 '11 at 15:37

the simplest way, use pgrep

in crontab:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
share|improve this answer
Love the simplicity of this answer. FYI, you should be able to add the -f flag to pgrep, and you can then check the full process name, which is useful if you also want to inspect the arguments to the process as part of your condition. – Craig Sefton May 7 '14 at 8:59
No, you can't use the -f flag with pgrep inside a cronjob. The reason is that you'll match against the shell script used to run the cronjob itself. – CpnCrunch Jul 27 '15 at 23:34

Run a script, instead of directly the program. There are many possibilities. For example :

RESTART="myprog params"
# find myprog pid
# if not running
if [ $? -ne 0 ]
share|improve this answer
FYI -- using scalar variables to store argument lists is considered bad practice. See for an example of a case where it fails. – Charles Duffy Dec 4 '13 at 15:59
...similarly, pgrep myprog; if [ $? -ne 0 ]; then ... would be better written as if ! pgrep myprog; then ... – Charles Duffy Dec 4 '13 at 16:00
...this latter style is not only more readable, but also less error-prone: It's easy to unintentionally disrupt the value of $?, for instance by adding log messages or error handling between lines. – Charles Duffy Dec 4 '13 at 16:00

This script will not run again if the previous instance hasn't finished. If you want to not run something if another specific process is running, see harrymc's script.

DATE=`date +%c`;
ME=`basename "$0"`;
exec 8>$LCK;

if flock -n -x 8; then
  echo ""
  echo "Starting your script..."
  echo ""


  echo ""
  echo "Script started  $DATE";
  echo "Script finished `date +%c`";
  echo "Script NOT started - previous one still running at $DATE";
share|improve this answer

You could use a lock file in your script, but please see Process Management.

flock is one utility that can be used.

share|improve this answer
good one! now rsync over this slow line can take all the time it needs, firing within 5 minutes of the client host coming on line without manual intervention: */5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest] – eMPee584 Jan 7 at 19:54

This is usually handled by the program itself rather than by cron. There are two standard techniques for this:

1) grep the output of ps to see whether there's a process by that name already running

2) On startup, first check for the existence of a pid (process id) file, usually at /var/run/, and, if it exists, read the pid out of the file and check whether that process still exists; if it does, refuse to start. If the pid file doesn't exist or the pid in the file has gone away, then create a pid file, write your process id into it, and continue on with normal startup.

While it's technically possible to write bash pipes that will do either of these directly into your crontab, it's better to add them to the program being started (so that they'll apply no matter how it gets started) or to write a wrapper script to handle this, as harrymc suggested.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.