我如何确定某个进程是否正在运行,然后让 bash 脚本根据该条件执行一些操作?
例如:
如果进程
abc
正在运行,则执行此操作如果它没有运行,就执行此操作。
答案1
执行此类操作的 Bash 脚本如下所示:
#!/bin/bash
# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern.
if pgrep -x "gedit" > /dev/null
then
echo "Running"
else
echo "Stopped"
fi
该脚本只是检查程序“gedit”是否正在运行。
或者你只能像这样检查程序是否没有运行:
if ! pgrep -x "gedit" > /dev/null
then
echo "Stopped"
fi
答案2
任何使用类似ps aux | grep abc
或pgrep abc
有缺陷的解决方案。
为什么?
因为您不是在检查特定进程是否正在运行,而是在检查是否有任何恰好与 匹配的正在运行的进程abc
。任何用户都可以轻松创建和运行名为 的可执行文件abc
(或abc
在其名称或参数中包含某处),从而导致您的测试出现误报。您可以对 和 运用各种选项来ps
缩小grep
搜索pgrep
范围,但您仍然无法获得可靠的测试。
那么,如何可靠地测试某个正在运行的进程?
这取决于您需要测试什么。
我想确保服务美国广播公司正在运行,如果没有,则启动它
这就是 systemd 的作用。它可以自动启动服务并跟踪它,当服务停止时它可以做出反应。
看我如何检查我的游戏服务器是否仍在运行......寻找其他解决方案。
美国广播公司是我的脚本。我需要确保只有一个脚本实例正在运行。
在这种情况下,使用 lockfile 或 lockdir。例如
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
看Bash 常见问题 45其他锁定方式。
答案3
答案4
借鉴@rommel-cid的想法,pidof
如果进程不存在,您可以使用||(||)来运行命令,如果进程存在,则使用&&来运行某些命令,从而创建一个快速的if/then/else条件。例如,这里有一个正在运行的进程(我的chrome浏览器,其进程名称为“chrome”)和一个测试不存在的进程的进程。我使用1> / dev / null抑制了标准输出,以便它不会打印:
$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
instead"
it's not running? ok i'll run instead
$