如何使用Linux命令查找进程(比如aa.sh)是否正在运行。ps命令似乎无法生效,并没有显示脚本名称。
请给予建议。
查看这个
ps aux | grep "aa.sh"
ps aux | grep "[a]a.sh"
。 - Vassilispgrep
是正确的方法,这个解决方案需要@Vassilis的技巧才能正常工作。 - Gilles Quénot最简单和高效的解决方案是:
pgrep -fl aa.sh
或作为条件:
if pgrep -fl aa.sh &>/dev/null; then
do...
fi
if [ $? = 0 ]
来判断进程是否被找到(pgrep 返回 0)或未被找到(pgrep 返回 1)。 - otocan补充以上答案:
要在脚本中使用,请使用以下内容:
result=`ps aux | grep -i "myscript.sh" | grep -v "grep" | wc -l`
if [ $result -ge 1 ]
then
echo "script is running"
else
echo "script is not running"
fi
ps aux | grep -i "myscript.sh" | grep -v "grep" | wc -l
,输出为0。但如果我在我的脚本中运行它,结果为2并且脚本退出。有什么建议吗? - Ahueps aux | grep hello
,您将看到grep作为一个进程。为了防止grep显示自己,我使用了一个技巧:ps aux | grep [h]ello
。 - Vassilisgetscript() {
pgrep -lf ".[ /]$1( |\$)"
}
示例用法:
# List instance(s) of script "aa.sh" that are running.
getscript "aa.sh" # -> (e.g.): 96112 bash /Users/jdoe/aa.sh
# Use in a test:
if getscript "aa.sh" >/dev/null; then
echo RUNNING
fi
pgrep
调用中添加 -i
以使其不区分大小写;在 Linux 上,这不是一个选项)。getscript
函数也适用于包含文件名组件的完整或部分路径;部分路径不能以 /
开头,每个指定的组件必须完整。 指定的路径越“完整”,误报的风险就越低。注意:只有当脚本使用路径“调用”时,路径匹配才会起作用 - 对于在 $PATH 中直接调用的脚本通常如此。ps
和 pgrep
都没有反映对命令行应用的原始引号。该函数保证的是任何匹配都不是第一个标记(即解释器),并且它作为一个独立的单词出现,可选地在路径之前。bash
)- 假设已知;例如:# List instance(s) of a running *bash* script.
getbashscript() {
pgrep -lf "(^|/)bash( | .*/)$1( |\$)"
}
请检查这个
ps -ef | grep shellscripname.sh
你也可以在下面找到正在运行的进程:
ps -ef
我被mklement0的最后一个回答所启发 - 我有一些脚本/小程序,我通过/etc/crontab
在每次重启时运行。我基于他的答案构建了一个登录脚本,可以显示我的程序是否仍在运行。
我通过.profile
文件在每次登录时执行这个scripts.sh
,以便获得即时通知。
cat scripts.sh
#!/bin/bash
getscript() {
pgrep -lf ".[ /]$1( |\$)"
}
script1=keepalive.sh
script2=logger_v3.py
# test if script 1 is running
if getscript "$script1" >/dev/null; then
echo "$script1" is RUNNING
else
echo "$script1" is NOT running
fi
# test if script 2 is running:
if getscript "$script2" >/dev/null; then
echo "$script2" is RUNNING
else
echo "$script2" is NOT running
fi
pgrep -f aa.sh
要使用id执行某些操作,您需要使用管道符。这里我将结束其所有子任务。
pgrep aa.sh | xargs pgrep -P ${} | xargs kill
pgrep aa.sh && echo Running
这是一个快速脚本,用于测试shell脚本是否在运行。
#!/bin/sh
scripToTest="your_script_here.sh"
scriptExist=$(pgrep -f "$scripToTest")
[ -z "$scriptExist" ] && echo "$scripToTest : not running" || echo "$scripToTest : runnning"
给ps一个选项,以显示所有进程,例如:
ps -A | grep "myshellscript.sh"
查看http://www.cyberciti.biz/faq/show-all-running-processes-in-linux/以获取更多信息。
正如Basile Starynkevitch在评论中提到的那样,pgrep
是另一种解决方案。
ps -ae
显示了脚本名称给我。 - nimsps aux|grep scriptname
或者pgrep scriptname
的意思是在当前系统中查找名为 "scriptname" 的进程。ps aux
命令用于显示所有正在运行的进程,而grep
命令则用于根据关键字过滤出匹配的结果。另外,pgrep
命令也可以直接查找与给定名称匹配的进程,并返回进程 ID。 - Basile Starynkevitchpidof
命令来获取进程的 PID。 - tripleee