Existe-t-il un moyen pour moi de dire à cron d'exécuter une application MAIS de ne pas l'exécuter si un processus existe déjà?
Existe-t-il un moyen pour moi de dire à cron d'exécuter une application MAIS de ne pas l'exécuter si un processus existe déjà?
Réponses:
la manière la plus simple, utilisez pgrep
dans crontab:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
pour éviter les Could not connect to display
erreurs. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Exécutez un script, au lieu de directement le programme. Il existe de nombreuses possibilités. Par exemple :
MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
$RESTART
fi
pgrep myprog; if [ $? -ne 0 ]; then ...
serait mieux écrit commeif ! pgrep myprog; then ...
$?
, par exemple en ajoutant des messages de journal ou une gestion des erreurs entre les lignes.
Ce script ne s'exécutera pas à nouveau si l'instance précédente n'est pas terminée. Si vous ne souhaitez pas exécuter quelque chose si un autre processus spécifique est en cours d'exécution, consultez le script de harrymc.
DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;
if flock -n -x 8; then
echo ""
echo "Starting your script..."
echo ""
[PUT YOUR STUFF HERE]
echo ""
echo "Script started $DATE";
echo "Script finished `date +%c`";
else
echo "Script NOT started - previous one still running at $DATE";
fi
Vous pouvez utiliser un fichier de verrouillage dans votre script, mais veuillez consulter Gestion des processus .
flock
est un utilitaire qui peut être utilisé.
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
Ceci est généralement géré par le programme lui-même plutôt que par cron
. Il existe deux techniques standard pour cela:
1) grep
la sortie de ps
pour voir si un processus de ce nom est déjà en cours d'exécution
2) Au démarrage, vérifiez d'abord l'existence d'un fichier pid (identifiant de processus), généralement sur /var/run/program_name.pid
, et, s'il existe, lisez le pid du fichier et vérifiez si ce processus existe toujours; si c'est le cas, refusez de commencer. Si le fichier pid n'existe pas ou que le pid dans le fichier a disparu, créez un fichier pid, écrivez-y votre identifiant de processus et continuez avec un démarrage normal.
Bien qu'il soit techniquement possible d'écrire des tuyaux bash qui feront l'un ou l'autre directement dans votre crontab, il est préférable de les ajouter au programme en cours de démarrage (afin qu'ils s'appliquent quelle que soit la façon dont il démarre) ou d'écrire un script wrapper dans gérer cela, comme l'a suggéré harrymc.
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
J'ai réutilisé la réponse ci-dessus avec une amélioration de la correspondance des modèles. pgrep sans l'option f ne correspond pas au modèle de processus. Pourtant, il y a un problème avec l'utilisation de l'option f. Avec l'option f, le shell engendrant le cron est toujours mis en correspondance et retourne son pid donc le processus n'est jamais redémarré.
L'ajout d'un [] autour d'une des lettres correspond uniquement au processus et le pid du shell cron n'est pas renvoyé.