ps dentro crontab não está vendo um processo em execução

4

Eu tenho esse robô worker.py , que acabei de executar como:

python worker.py --details

Existem muitos problemas em torno deste robô, por isso continua a descer a cada 30 minutos.

Quando o robô está rodando, ps aux | grep worker.py me dá saída:

root      3870  6.2 11.7 997960 59052 pts/0    Sl   10:47   0:32 python worker.py --details
root      4030  0.0  0.4   9752  2312 pts/0    S+   10:55   0:00 grep --color=auto worker

Então, eu configurei meu cron para rodar a cada 10 minutos com este comando:

cd /path/to/boot && if [ 2 -gt 'ps aux | grep worker.py | wc -l' ]; then python worker.py --detail &> /dev/null ; fi

A questão é:

  • Se eu apenas executar o comando acima diretamente na linha de comando, ele funcionará bem (se o robô estiver em execução, nada acontecer, se o robô estiver inativo, ele se levantará novamente).
  • Quando o cron executa o comando, ele cria um novo processo, a cada 10 minutos (lutando com meu banco de dados), porque não está vendo o processo atual, presumo. *

Tudo acima é feito como root, então, eu acho que não é sobre problemas do usuário.

Obrigado

    
por Thiago Melo 21.06.2016 / 16:07

2 respostas

3

O que você precisa é de um arquivo de bloqueio e verificar esse arquivo de bloqueio. Se estiver lá, termine o script.

Um exemplo de comando seria shlock .

  

DESCRIÇÃO

     

O Shlock tenta criar um arquivo de bloqueio denominado name e gravar o ID do processo pid nele. Se o arquivo já existir, o shlock lerá o ID do processo do arquivo e testará para ver se o processo está sendo executado no momento. Se o processo existir, o arquivo não será criado. O Shlock sai com um status zero se foi capaz de criar o arquivo de bloqueio ou diferente de zero se o arquivo se referir ao processo ativo no momento.

    
por Rinzwind 21.06.2016 / 16:10
0

o cron não consegue encontrar o processo com ps aux, o padrão ps COLUMNS é 80. Ou seja, a saída do comando ps é truncada para 80 COLUMNS.

ps -aef before column set:
admin    28695     1  0 08:37 ?        00:00:00 /usr/bin/python /home/admin/MyP

ps -aef after column set:
admin    28695     1  0 08:37 ?        00:00:00 /usr/bin/python /home/admin/MyPython/test.py

Adicione as colunas ao crontab começando como abaixo e isso irá corrigir o problema.

crontab com abaixo:

SHELL=/bin/bash
COLUMNS=160
37 08 * * * /home/admin/MyPython/test.py >>  /home/admin/MyPhon/test.py.log 2>&1 &

test.py contém abaixo:

cmd1="ps -aef >> /home/admin/MyPython/test_ps.txt; echo COLUMNS: ${COLUMNS} ${Shell}>> /home/admin/MyPython/test_ps.txt;"
print cmd1
os.system(cmd1)

Espero que isso responda.

    
por Sree 20.03.2017 / 19:40

Tags