
Estou tentando escrever dois scripts. Mas tenho problemas quando tento evitar que um deles seja executado duas vezes seguidas. Por exemplo, eu tenho script1 e script2. quero poder executar o script1 se e somente se o script2 foi executado desde a última vez que executei o script1. alguma ideia?
Responder1
No script A, verifique se existe um determinado arquivo e, caso não exista, toque em um arquivo no diretório /tmp (por exemplo: touch /tmp/script.lock
) e execute o código. Então no script B, verifique se o arquivo existe. Se o arquivo existir, execute o corpo do script e exclua o arquivo posteriormente.
Roteiro A:
if [ ! -f /tmp/script.lock ]
then
echo hello
touch /tmp/script.lock
fi
Roteiro B:
if [ -f /tmp/script.lock ]
then
echo hello
rm /tmp/script.lock
fi
Responder2
Faça com que cada script verifique um determinado arquivo (por exemplo /var/tmp/script1-2
, ).
Se o arquivo de verificação não existir, escreva o nome do outro script no arquivo o mais cedo possível, para evitar que ele seja executado enquanto o script estiver em execução.
Se existir e contiver seu próprio nome, saia. Caso contrário, execute normalmente.
Pouco antes de sair, cada script deve escrever seu próprio nome no arquivo.
CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1
# rest of script here
.
.
echo "$MYNAME" > "$CHECKFILE"
As grep
opções são:
-q
para silêncio, não produz saída-w
para combinar apenas palavras inteiras-F
para combinar strings fixas, não expressões regulares.
Nota: se ambos os scripts forem executados emexatamenteao mesmo tempo e $CHECKFILE ainda não existe, ambos serão executados. O que terminar por último (leva mais tempo para ser executado) terminará com seu nome escrito em $CHECKFILE. Para evitar isso, execute echo script2 > /var/tmp/script1-2
antes de executar qualquer um deles.
Responder3
Uma opção poderia ser executar o comando "date" no script 1 e redirecionar essa saída para algum arquivo, digamos "file.txt" - e então o script 2 pode ler este "file.txt" e fazer uma comparação de "data" entre este data e a data em que o script 2 foi executado? As comparações de "datas" devem ser relativamente fáceis de fazer - muitos exemplos na web (eu acredito). Alimento para o pensamento.
Outra opção (dependendo da sua necessidade) é, claro, adicionar entradas de trabalho "cron".
Responder4
Se você quiser apenas saber se o script2 foi executado antes, faça isso:
No script2 faça em qualquer lugar:
touch .ran_already
.
Agora no script1 faça:
if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi
Isso lhe servirá bem, embora seja rápido e sujo.