我有一个在cron中运行的perl脚本,如果脚本无法运行,则会留下一个锁定文件,以防止脚本再次运行。
我正在尝试运行一个bash脚本来检查进程是否正在运行并检查锁文件是否被遗留
如果进程正在运行且存在锁定文件 退出0;
如果进程未运行且存在锁定文件 rm lockfile。 退出0;
如果进程不存在且锁定文件“不存在” 退出0;
我一直在检查进程是否仍在运行 ps ax | grep -v grep | grep process.pl
我正在寻找我应该在这里运行的bash中的条件。
由于
答案 0 :(得分:2)
-e
表示“文件存在”:
$ if [ -e /etc/passwd ]; then echo "passwords" ; else echo "no passwords" ; fi
passwords
-n
表示“字符串长度为零”(对pidof(1)
命令有用)。
$ F=$(pidof firefox-bin) ; if [ -n "$F" ]; then echo "browser" ; else echo "boring" ; fi
browser
$ F=$(pidof chrome) ; if [ -n "$F" ]; then echo "browser" ; else echo "boring" ; fi
boring
(我firefox
正在运行,但不是chrome
。)
答案 1 :(得分:1)
process.pl
应将其进程ID写入lockfile,这是一种常见模式。然后你可以编写以下代码:
if [ -f "$lockfile" ]; then
pid=$(cat "$lockfile")
if kill -0 "$pid"; then
: "running normally"
else
: "terminated somehow"
rm -f "$lockfile"
fi
fi
答案 2 :(得分:0)
检查this question以获取一些技巧,以确保在bash中只运行一个脚本副本。
答案 3 :(得分:0)
pgrep -f process.pl || { [ -f lock.file ] && rm lock.file; }