如果脚本没有运行,如何检查并运行它?

如果脚本没有运行,如何检查并运行它?

我创建了一个非常简单的脚本,名为main_start_script它将在后台运行 2 个 python 程序,代码是:

python /opt/cuckoo/cuckoo-2/cuckoo.py 1>cuckoo_script/cuckoo_start.txt 2>&1 &
python /opt/cuckoo/cuckoo-2/utils/web.py 1>cuckoo_script/web_start.txt 2>&1 &

现在我想知道如何检查这两个程序是否正在运行,如果没有,则运行脚本来启动它们。

我听说有人推荐使用“Puppet”来检查,但到目前为止我还没有找到有用的教程。

答案1

看到这个类似的计算器问题。该pgrep命令可以检查正在运行的进程是否存在。

该命令pgrep -f <file>将返回指定文件的当前实例数。例如:

[user@localhost ~]$ pgrep -f /sbin/init
1
[user@localhost ~]$

如果文件不与进程关联,它将不会返回任何内容。

这可以合并到 bash 脚本中,如果脚本尚未运行,则该脚本将执行:

#!/bin/bash
if [[ ! $(pgrep -f script.sh) ]]; then
    script.sh
fi

答案2

使用 bash 的特殊 shell var '$!' 保存每个命令的 PID 号这是最后一个命令的进程 pid,然后在尝试再次运行该命令之前检查“/proc/PID”是否存在。

#!/bin/bash

do_cuckoo() {
  python /opt/cuckoo/cuckoo-2/cuckoo.py 1>cuckoo_script/cuckoo_start.txt 2>&1 & echo $! >/tmp/cuckoo.pid
}
do_web() {
  python /opt/cuckoo/cuckoo-2/utils/web.py 1>cuckoo_script/web_start.txt 2>&1 & echo $! >/tmp/web.pid
}

do_cuckoo && do_web # First time run

# You should add a proper sleep timer below.
while :; do
  [ ! -d /proc/$(</tmp/cuckoo.pid) ] && do_cuckoo
  [ ! -d /proc/$(</tmp/web.pid) ] && do_web
done

也许最好使用“until”来代替 while 循环。我会把这个任务留给你去完成;)

相关内容