我创建了一个非常简单的脚本,名为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 循环。我会把这个任务留给你去完成;)