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

0

Eu estou tentando escrever dois scripts. Mas eu me deparo com problemas quando tento evitar que um deles seja executado duas vezes seguidas. Por exemplo, eu tenho script1 e script2. Eu quero ser capaz de executar script1 se e somente se script2 foi executado desde a última vez que eu executei script1. alguma idéia?

    
por matt 05.11.2015 / 21:22

4 respostas

1

No script A, verifique se existe um determinado arquivo e, se não, 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.

Script A:

if [ ! -f /tmp/script.lock ]
then    
    echo hello
    touch /tmp/script.lock
fi

Script B:

if [ -f /tmp/script.lock ]
then
    echo hello
    rm /tmp/script.lock
fi
    
por 05.11.2015 / 21:44
1

Peça 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 este script estiver sendo executado.

Se ele 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 opções grep são:

  • -q para tranquilidade, não produz saída
  • -w para correspondência apenas de palavras inteiras
  • -F para correspondência de cadeias fixas, não expressões regulares.

Nota: se ambos os scripts forem executados no exatamente ao mesmo tempo e $ CHECKFILE ainda não existir, ambos serão executados. Qualquer um que termine por último (leva mais tempo para executar) terminará com seu nome escrito em $ CHECKFILE. Para evitar isso, execute echo script2 > /var/tmp/script1-2 antes de executar qualquer um deles.

    
por 05.11.2015 / 21:46
0

Uma opção poderia ser executar o comando "date" no script 1 e redirecionar essa saída para algum arquivo, digamos "file.txt" - e, em seguida, o script 2 pode ler este arquivo "file.txt" e fazer um "date" comparação entre esta data e a data em que o script 2 foi executado? "Data" comparações 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".

    
por 05.11.2015 / 21:32
0

Se você quiser apenas saber se o script2 foi executado antes, faça o seguinte:

No script2, faça o seguinte:

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 vai lhe servir bem, embora seja rápido e sujo.

    
por 05.11.2015 / 21:43