Como posso verificar se um script está em execução e pausar até que a instância seja concluída para ser executada novamente?

Como posso verificar se um script está em execução e pausar até que a instância seja concluída para ser executada novamente?

Então executamos esse script que adiciona dados a um arquivo e estou tentando adicionar algo para verificar se o script já está sendo executado. Nesse caso, quero fazer uma pausa e verificar novamente em 20 segundos e repetir até descobrir que não está funcionando. Nesse ponto, gostaria de prosseguir para o restante do script. Portanto, preciso saber como fazer com que ele continue verificando até que esteja tudo bem para prosseguir. Alguém tem uma ideia?

    if [ `ps -ef| grep $script_name_with_arguments | wc -l ` -gt 1 ]
    then
      echo "already running"
      sleep 20s
    else
      echo "ok"
    fi
}```

Responder1

Você usa algum tipo de bloqueio.

A maneira mais simples é um arquivo de bloqueio. Existem alguns pacotes que irão gerenciar isso para você; você não disse qual era a sua plataforma ou distro, então não posso ser muito preciso sobre isso, mas uma delas é o procmailpacote que acompanha o lockfileprograma.

Você usaria isso em seu script assim:

LOCK=/run/npaulsen/mylockfile.lock
lockfile -20 $LOCK
run_the_fscking_rest_of_my_script
rm -f $LOCK

Existem refinamentos que você pode fazer para evitar que ele fique preso indefinidamente no caso de uma instância travar. Você pode ler a página de manual sobre isso: man 1 lockfile. Ou você pode implementar o seu próprio - é trivial, mas você precisará de uma linguagem de programação real (não de um shell script).

Outra ideia mais sofisticada (mas também mais complexa) seria utilizar semáforos POSIX; tentar man 7 sem_overview.

informação relacionada