I have a backup script which sends my snapshots to a off-site location.0 0 * * * /root/backup/backup_incremental >> /root/backup/test.logFor some reason my PID file which should stop the script form executing a second time doesn't work with cron. If I open two shells and start my script twice everything works as expected.#!/usr/local/bin/zshPATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin DATE=`date +%Y-%m-%d_%H-%M-%S` SCRIPTNAME=`basename $0`PIDFILE=/var/run/${SCRIPTNAME}.pidif [ -f ${PIDFILE} ]; then       #verify if the process is actually still running under this pid         OLDPID=`cat ${PIDFILE}`         RESULT=`ps -ef | grep ${OLDPID} | grep ${SCRIPTNAME}`           if [ -n ${RESULT} ]; then             echo ${DATE}: Script already running (PID: ${OLDPID})! Exiting             exit 255         fifi#grab pid of this process and update the pid file with itPID=`ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} '`echo ${PID} > ${PIDFILE}#send it....if [ -f ${PIDFILE} ]; then    rm ${PIDFILE}fiThis is my script striped down to the important bits. So my question is how can cron start this more than once?
Cron start script twice
shell script;grep;ps
PID=`ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} '`This could either return the PID of your script, or of the grep process, or of some unrelated process that happens to have a similar enough name. This is likely to be the cause of your problem: sometimes your script writes its own PID to the pidfile and sometimes it writes something else.The PID of your script is in the variable $$.For those cases when you actually need to find the PID of a process given its name, see Finding the ID of a process and killing it and grep - why do brackets in grep pattern remove the grep process from ps results?