Como escrevo um script para ser executado somente se outro script tiver sido executado mais recentemente?

Como escrevo um script para ser executado somente se outro script tiver sido executado mais recentemente?

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 grepopções são:

  • -qpara silêncio, não produz saída
  • -wpara combinar apenas palavras inteiras
  • -Fpara 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-2antes 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.

informação relacionada