Bash if和or conditionals

时间:2011-07-02 07:36:40

标签: bash

我有一个在cron中运行的perl脚本,如果脚本无法运行,则会留下一个锁定文件,以防止脚本再次运行。

我正在尝试运行一个bash脚本来检查进程是否正在运行并检查锁文件是否被遗留

如果进程正在运行且存在锁定文件 退出0;

如果进程未运行且存在锁定文件 rm lockfile。 退出0;

如果进程不存在且锁定文件“不存在” 退出0;

我一直在检查进程是否仍在运行 ps ax | grep -v grep | grep process.pl

我正在寻找我应该在这里运行的bash中的条件。

由于

4 个答案:

答案 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; }