Gunakan flock
. Baru. Lebih baik.
Sekarang Anda tidak perlu menulis kode sendiri. Lihat lebih banyak alasan di sini:https://serverfault.com/a/82863
/usr/bin/flock -n /tmp/my.lockfile /usr/local/bin/my_script
Saya melakukan ini untuk program spooler cetak yang saya tulis, itu hanya skrip 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
Ini berjalan setiap dua menit dan cukup efektif. Saya memilikinya melalui email dengan informasi khusus jika karena alasan tertentu prosesnya tidak berjalan.
Seperti yang telah dinyatakan orang lain, menulis dan memeriksa file PID adalah solusi yang baik. Inilah implementasi bash saya:
#!/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}"