Se a instrução não estiver funcionando no cronjob

0

bash cronjob continua a criar um novo processo, mesmo que minha instrução if diga para não executar se o processo ou a porta já existir ...

cat / etc / crontab

*/1 * * * * root /opt/script.sh

também tentou:

* * * * * /opt/script.sh

o script abre uma porta, então eu tentei verificar o número da porta usando lsof para determinar se o script foi executado.

#!/bin/bash

port='1234'
if ! lsof -i | grep -o $port; then
    command ...
fi

mas isso não funcionou, a cada 60 segundos outro script.sh é executado e de alguma forma existem múltiplos processos ocupando a porta 1234. então eu tentei usar ps ao invés de lsof.

#!/bin/bash

c=$(sudo ps aux | grep -o '[s]cript\.sh')
if [[ $c != 'script.sh' ]]; then
    command ...
fi

mas isso também não funciona. Oque esta acontecendo aqui? Talvez eu não tenha entendido como os cronjobs funcionam, porque eu não consigo entender porque as declarações if não estão funcionando e impedindo que o comando seja executado novamente.

estou usando o ubuntu 16.04, totalmente atualizado.

    
por user903169 09.05.2018 / 10:56

1 resposta

1

Existe uma confusão entre diferentes maneiras de adicionar cron jobs.

Se você adicionar uma tarefa com crontab -e , não haverá coluna user (a tarefa será executada como usuário atual), enquanto as entradas em /etc/crontab deverão ter a coluna user . Como as entradas estão em /etc/crontab , você precisa usar o primeiro formato (observe que no tempo de programação * e */1 são equivalentes).

Desde que você esteja usando a entrada correta crontab , seu script usando lsof deve funcionar, embora grep -q pare a saída desnecessária. Observe que lsof precisa ser executado como root para obter uma lista completa.

Seu script usando ps é mais problemático: -

  • O uso de sudo é desnecessário se você estiver executando como root e falhará de outra forma, já que precisa solicitar a senha; Além disso, ps produz a mesma listagem, seja em execução como root ou não.
  • Se houver mais de uma correspondência no ps ... | grep ... , você precisará de aspas duplas para a sintaxe correta na configuração de c .
  • Se c estiver vazio ou houver mais de uma correspondência, então $c no teste precisará de aspas duplas para a sintaxe correta.
  • Se c contiver mais de uma instância de script.sh , o teste falhará.

Você pode contornar esses problemas usando a mesma técnica usada no script lsof : -

if ! ps aux | grep -q '[s]cript\.sh'; then
    command ...
fi

A propósito, eu gosto do uso de [s]cript\.sh para parar grep em si.

    
por 09.05.2018 / 13:55