Cron start script duas vezes

0

Eu tenho um script de backup que envia meus instantâneos para um local externo.

0 0 * * * /root/backup/backup_incremental >> /root/backup/test.log

Por alguma razão, meu arquivo PID, que deve parar o script em execução pela segunda vez, não funciona com o cron. Se eu abrir dois shells e iniciar meu script duas vezes, tudo funcionará como esperado.

#!/usr/local/bin/zsh

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 
DATE='date "+%Y-%m-%d_%H-%M-%S"' 

SCRIPTNAME='basename $0'
PIDFILE=/var/run/${SCRIPTNAME}.pid


if [ -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
         fi

fi

#grab pid of this process and update the pid file with it
PID='ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} ''
echo ${PID} > ${PIDFILE}

#send it
....


if [ -f ${PIDFILE} ]; then
    rm ${PIDFILE}
fi

Este é o meu roteiro desdobrado para os bits importantes.

Então, minha pergunta é como o cron pode iniciar isso mais de uma vez?

    
por Sir l33tname 21.03.2015 / 20:28

1 resposta

1
PID='ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} ''

Isso pode retornar o PID do seu script ou do processo grep ou de algum processo não relacionado que tenha um nome semelhante. É provável que essa seja a causa do seu problema: às vezes, seu script grava seu próprio PID no pidfile e, às vezes, ele grava outra coisa.

O PID do seu script está na variável $$ .

Para os casos em que você realmente precisa encontrar o PID de um processo que recebe seu nome, consulte Encontrando o ID de um processo e matando-o e grep - por que os parênteses no padrão grep removem o processo do grep dos resultados ps?

    
por 21.03.2015 / 20:33