J'essaye donc de mettre en place un travail cron comme une sorte de chien de garde pour un démon que j'ai créé. Si le démon échoue et échoue, je veux que le travail cron le redémarre périodiquement ... Je ne sais pas si c'est possible, mais j'ai lu quelques didacticiels cron et je n'ai rien trouvé qui ferait ce que je je cherche ...
Mon démon démarre à partir d'un script shell, donc je recherche simplement un moyen d'exécuter une tâche cron UNIQUEMENT si l'exécution précédente de cette tâche n'est pas encore en cours d'exécution.
J'ai trouvé cet article , qui fournissait une solution à ce que j'essaie de faire en utilisant des fichiers de verrouillage, mais je ne suis pas sûr qu'il existe une meilleure façon de le faire ...
Merci de votre aide.
grep -v grep | grep doctype.php
vous pouvez le fairegrep [d]octype.php
.&
si c'est cron qui exécute le script.Utilisez
flock
. C'est nouveau. C'est mieux.Vous n'avez plus besoin d'écrire le code vous-même. Découvrez plus de raisons ici: https://serverfault.com/a/82863
la source
setlock
,s6-setlock
,chpst
Etrunlock
dans leurs modes non-blocage des alternatives qui sont disponibles sur plus que Linux. unix.stackexchange.com/a/475580/5132Comme d'autres l'ont indiqué, écrire et vérifier un fichier PID est une bonne solution. Voici ma mise en œuvre bash:
la source
>
" versus ">>
". Désolé pour ça.[ -e "${PIDFILE}" ]
". Si ce n'est pas le cas, il démarrera le programme en arrière-plan, écrira son PID dans un fichier ("echo $! > "${PIDFILE}"
"), et quitter. Si le fichier PID existe à la place, le script vérifiera vos propres processus ("ps -u $(whoami) -opid=
") et verra si vous en exécutez un avec le même PID ("grep -P "^\s*$(cat ${PIDFILE})$"
"). Si ce n'est pas le cas, il lancera le programme comme avant, écrasez le fichier PID avec le nouveau PID et quittez. Je ne vois aucune raison de modifier le script; n'est-ce pas?Il est surprenant que personne n'ait parlé de run-one . J'ai résolu mon problème avec ça.
puis ajoutez
run-one
avant votre script crontabDécouvrez cette réponse askubuntu SE. Vous pouvez également y trouver un lien vers des informations détaillées.
la source
N'essayez pas de le faire via cron. Demandez à cron d'exécuter un script quoi qu'il arrive, puis demandez au script de décider si le programme est en cours d'exécution et de le démarrer si nécessaire (notez que vous pouvez utiliser Ruby ou Python ou votre langage de script préféré pour ce faire)
la source
Vous pouvez également le faire en one-liner directement dans votre crontab:
la source
ps -ef|grep [c]ommand
-eq 0] && <command> où le fait de placer la première lettre de votre commande entre crochets l'exclut des résultats de grep.[ "$(ps -ef|grep [c]ommand|wc -l)" -eq 0 ] && <command>
[ $(grep something | wc -l) -eq 0 ]
est une manière vraiment détournée d'écrire! grep -q something
. Donc, vous voulez simplementps -ef | grep '[c]ommand' || command
grep -c
.)La façon dont je le fais lorsque j'exécute des scripts php est:
Le crontab:
Le code php:
Cette commande recherche dans la liste des processus système le nom de fichier php actuel s'il existe, le compteur de ligne (wc -l) sera supérieur à un car la commande de recherche elle-même contenant le nom de fichier
donc si vous exécutez php crons, ajoutez le code ci-dessus au début de votre code php et il ne fonctionnera qu'une seule fois.
la source
Pour faire suite à la réponse d'Earlz, vous avez besoin d'un script wrapper qui crée un fichier $ PID.running au démarrage et le supprime lorsqu'il se termine. Le script wrapper appelle le script que vous souhaitez exécuter. L'encapsuleur est nécessaire en cas d'échec du script cible ou d'erreur, le fichier pid est supprimé.
la source
Avec,
lockrun
vous n'avez pas besoin d'écrire un script wrapper pour votre tâche cron. http://www.unixwiz.net/tools/lockrun.htmlla source
Je recommanderais d'utiliser un outil existant tel que monit , il surveillera et redémarrera automatiquement les processus. Il y a plus d'informations disponibles ici . Il devrait être facilement disponible dans la plupart des distributions.
la source
Celui-ci ne m'a jamais manqué:
one.sh :
travail cron :
la source
MISE À JOUR .. meilleure façon d'utiliser flock:
la source
Je suggérerais ce qui suit pour améliorer la réponse de rsanden (je posterais comme commentaire, mais je n'ai pas assez de réputation ...):
Cela évite d'éventuelles fausses correspondances (et la surcharge de grepping), et supprime la sortie et ne repose que sur l'état de sortie de ps.
la source
ps
commande correspondrait aux PID des autres utilisateurs du système, pas seulement aux vôtres. L'ajout d'un "-u
" à laps
commande modifie le fonctionnement de l'état de sortie.Un simple php personnalisé suffit à atteindre. Pas besoin de confondre avec le script shell.
Supposons que vous vouliez exécuter php /home/mypath/example.php s'il n'est pas en cours d'exécution
Ensuite, utilisez le script PHP personnalisé suivant pour faire le même travail.
créer suivant /home/mypath/forever.php
Puis dans votre cron, ajoutez ce qui suit
la source
Pensez à utiliser pgrep (si disponible) plutôt que ps acheminé via grep si vous allez suivre cette route. Bien que, personnellement, j'ai beaucoup de kilomètres à parcourir avec les scripts du formulaire
Bien que cela puisse échouer et que les tâches cron soient souvent le meilleur moyen d'effectuer des tâches essentielles. Juste une autre alternative.
la source
Documents: https://www.timkay.com/solo/
Exemple
la source