jjc*_*son 113
我为我编写的打印后台程序程序执行此操作,它只是一个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
Run Code Online (Sandbox Code Playgroud)
它每两分钟运行一次,非常有效.如果由于某种原因进程没有运行,我会通过电子邮件向我发送特殊信息.
Jes*_*ess 101
使用flock.这是新的.这样更好.
现在您不必自己编写代码.查看更多原因:https://serverfault.com/a/82863
/usr/bin/flock -n /tmp/my.lockfile /usr/local/bin/my_script
Run Code Online (Sandbox Code Playgroud)
rsa*_*den 59
正如其他人所说,编写和检查PID文件是一个很好的解决方案.这是我的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}"
Run Code Online (Sandbox Code Playgroud)
Bed*_*mez 23
令人惊讶的是,没有人提到过第一次运行.我用这个解决了我的问题.
apt-get install run-one
Run Code Online (Sandbox Code Playgroud)
然后run-one在你的crontab脚本之前添加
*/20 * * * * * run-one python /script/to/run/awesome.py
Run Code Online (Sandbox Code Playgroud)
看看这个 askubuntu SE答案.您也可以在那里找到详细信息的链接.
Ear*_*rlz 22
不要试图通过cron来做.让cron运行一个脚本,无论如何,然后让脚本决定程序是否正在运行并在必要时启动它(请注意,您可以使用Ruby或Python或您喜欢的脚本语言来执行此操作)
小智 10
您也可以直接在crontab中以单行方式执行此操作:
* * * * * [ `ps -ef|grep -v grep|grep <command>` -eq 0 ] && <command>
Run Code Online (Sandbox Code Playgroud)
我在运行 php 脚本时这样做的方式是:
* * * * * php /path/to/php/script.php &
Run Code Online (Sandbox Code Playgroud)
<?php
if (shell_exec('ps aux | grep ' . __FILE__ . ' | wc -l') > 1) {
exit('already running...');
}
// do stuff
Run Code Online (Sandbox Code Playgroud)
此命令正在系统进程列表中搜索当前 php 文件名,如果它存在,行计数器 (wc -l) 将大于 1,因为搜索命令本身包含文件名
所以如果你运行 php crons 将上面的代码添加到你的 php 代码的开头,它只会运行一次。
作为Earlz回答的后续内容,您需要一个包装器脚本,它在启动时创建$ PID.running文件,并在结束时删除.包装器脚本调用您希望运行的脚本.如果目标脚本失败或错误输出,则必须使用包装器,pid文件将被删除.
| 归档时间: |
|
| 查看次数: |
101248 次 |
| 最近记录: |