如何确定某个进程是否正在运行,然后让bash脚本根据该条件执行某些操作?
例如:
如果进程
abc
正在运行,请执行此操作如果它没有运行,请执行此操作。
如何确定某个进程是否正在运行,然后让bash脚本根据该条件执行某些操作?
例如:
如果进程abc
正在运行,请执行此操作
如果它没有运行,请执行此操作。
Answers:
一个执行类似操作的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
/dev/null
:“ / dev / null将命令标准输出重定向到null设备,这是一种特殊设备,该设备会丢弃写入其中的信息” ...使用0
会将命令输出重定向到名为的文件0
。在这种情况下,我建议您逐渐适应> /dev/null
-您会在任何地方看到它,因为这是丢弃输出的标准/正确方法。
-x
参数,pgrep
以便它查找确切的应用程序,否则,如果在另一个应用程序名称内找到相同的字符串,它将得到错误的正确提示。我只是花了1个小时才找到答案。
! pgrep
任何使用类似ps aux | grep abc
或pgrep abc
有缺陷的解决方案。
由于您没有在检查特定进程是否正在运行,因此您正在检查是否有任何运行的进程恰好匹配abc
。任何用户都可以轻松地创建和运行名为abc
(或abc
名称或自变量中包含某处)的可执行文件,从而对测试造成误判。有可应用于各种选项ps
,grep
并pgrep
以缩小搜索范围,但你仍然不会得到一个可靠的测试。
这取决于您需要测试的内容。
这就是初始化和新贵的目的。他们将启动服务,并确保其pid被存储在pidfile中。尝试再次启动该服务(通过init或upstart),它将检查pidfile,如果不存在则启动它,如果已经运行则中止。这仍然不是100%可靠的,但与您所获得的接近。
有关其他解决方案,请参阅如何检查我的游戏服务器是否仍在运行。
在这种情况下,请使用锁定文件或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 FAQ 45。
pgrep
或ps
完全可以满足要求,而您的方法似乎有些过分。但是,如果您要编写公开发行的股票,则应以最安全的方式编写。
rm
命令都会运行。因此,只要在设置陷阱后结束,锁就应该消失了。
这是我用的:
#!/bin/bash
#check if abc is running
if pgrep abc >/dev/null 2>&1
then
# abc is running
else
# abc is not running
fi
简而言之:如果'pgrep'返回0,则进程正在运行,否则,进程未运行。
相关阅读:
Bash脚本:: 字符串比较
Ubuntu手册pgrep
pgrep
具有前面提到的相同的15个字符限制“功能”,因此例如pgrep gnome-power-manager
也会失败
-x
选项:“仅匹配名称(或命令行,如果指定-f)与模式完全匹配的进程”。
嘲笑@ 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
$
没有一个“简单”的解决方案对我有用,因为我需要检查的二进制文件未在系统范围内安装,因此我必须使用路径进行检查,而路径又需要使用以下ps -ef | grep
方法:
app="$_sdir/Logic 1.2.18 (64-bit)/Logic"
app_pid=`ps -ef | grep "$app" | awk '{print $2}'`
if `ps -p $app_pid > /dev/null`; then
echo "An instance of logic analyzer is appear to be running."
echo "Not starting another instance."
exit 5
else
nohup "$app" &> /dev/null &
fi
我发现@John Vrbanac发布的已接受答案对我不起作用,@ geirha发布的答案未回答原始问题。
John Vrbanac的解决方案无法为我检查PHP进程是否正在运行,我正在运行CentOS 7。
@geirha的答案只能确保启动另一个实例之前该实例尚未运行。这不是原始问题,原始问题是检查进程是否正在运行。
这对我有用:
假设我的流程名称中包含字符串“ Jane”。这将发现它是否正在运行。这适用于BASH和PHP脚本。
ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
echo "It's running"
else
echo "It's not running"
fi
## bash
## function to check if a process is alive and running:
_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}
## example 1: checking if "gedit" is running
if _isRunning gedit; then
echo "gedit is running"
else
echo "gedit is not running"
fi
## example 2: start lxpanel if it is not there
if ! _isRunning lxpanel; then
lxpanel &
fi
## or
_isRunning lxpanel || (lxpanel &)
注意:pgrep -x lxpanel
或即使已消失(僵尸)pidof lxpanel
仍报告lxpanel
正在运行;因此要获得活着和运行过程中,我们需要使用ps
和grep
#!/bin/bash
while [ true ]; do # Endless loop.
pid=`pgrep -x ${1}` # Get a pid.
if [ -z $pid ]; then # If there is none,
${1} & # Start Param to background.
else
sleep 60 # Else wait.
fi
done
zombie
进程”(不是我所描述的“正在运行”的进程)。STAT
在的输出中ps
,列值所表示的内容的完整列表在此适用于那些倾向于编写适应该问题的答案或自己编辑的人。