Utilisez flock
. C'est nouveau. C'est mieux.
Maintenant, vous n'avez pas à écrire le code vous-même. Découvrez plus de raisons ici :https://serverfault.com/a/82863
/usr/bin/flock -n /tmp/my.lockfile /usr/local/bin/my_script
Je le fais pour un programme de spouleur d'impression que j'ai écrit, c'est juste un script shell :
#!/bin/sh
if ps -ef | grep -v grep | grep doctype.php ; then
exit 0
else
/home/user/bin/doctype.php >> /home/user/bin/spooler.log &
#mailing program
/home/user/bin/simplemail.php "Print spooler was not running... Restarted."
exit 0
fi
Il fonctionne toutes les deux minutes et est assez efficace. Je l'ai envoyé par e-mail avec des informations spéciales si, pour une raison quelconque, le processus ne s'exécute pas.
Comme d'autres l'ont dit, écrire et vérifier un fichier PID est une bonne solution. Voici mon implémentation bash :
#!/bin/bash
mkdir -p "$HOME/tmp"
PIDFILE="$HOME/tmp/myprogram.pid"
if [ -e "${PIDFILE}" ] && (ps -u $(whoami) -opid= |
grep -P "^\s*$(cat ${PIDFILE})$" &> /dev/null); then
echo "Already running."
exit 99
fi
/path/to/myprogram > $HOME/tmp/myprogram.log &
echo $! > "${PIDFILE}"
chmod 644 "${PIDFILE}"