web-dev-qa-db-fra.com

ps dans crontab ne voit pas un processus en cours

J'ai ce robot worker.py, que je lance juste comme:

python worker.py --details

Il y a beaucoup de problèmes autour de ce robot, donc il continue à descendre toutes les 30 minutes.

Lorsque le robot est en cours d'exécution, ps aux | grep worker.py me donne un résultat:

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

Donc, je règle mon cron pour exécuter chaque 10 minutes avec cette commande:

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

Le problème est:

  • Si je viens d'exécuter la commande ci-dessus directement dans la ligne de commande, cela fonctionne correctement (si le robot est en cours d'exécution, rien ne se passe, si le robot est en panne, il se relève).
  • Lorsque cron exécute la commande, il crée un nouveau processus, toutes les 10 minutes (en difficulté dans ma base de données), car il ne voit pas le processus en cours, je suppose. *

Tout ce qui précède est créé en tant que racine, je suppose donc qu'il ne s'agit pas de problèmes d'utilisateurs.

Merci

4
Thiago Melo

Ce dont vous avez besoin est un fichier de verrouillage et recherchez ce fichier de verrouillage. Si c'est le cas, terminez le script sinon lancez-le.

Un exemple de commande serait shlock .

LA DESCRIPTION

Shlock tente de créer un fichier de verrouillage nommé nom et d'y écrire le pid d'ID de processus. Si le fichier existe déjà, shlock lit l'ID de processus à partir du fichier et teste si le processus est en cours d'exécution. Si le processus existe, le fichier ne sera pas créé. Shlock se termine avec un statut nul s'il est capable de créer le fichier de verrouillage, ou différent de zéro si le fichier fait référence à un processus actuellement actif.

3
Rinzwind

cron ne peut pas trouver le processus avec ps aux, la valeur par défaut de ps COLUMNS est 80. Par exemple, la sortie de la commande ps est tronquée à 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

Ajoutez les colonnes à la crontab en commençant comme ci-dessous et cela résoudra le problème.

crontab avec ci-dessous:

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

test.py contient ci-dessous:

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

J'espère que ça répond.

0
Sree