38

查找进程是否正在运行 aa.sh 的 linux 命令是什么。ps 命令似乎不起作用,并且它不显示 shell 脚本名称。

请指教。

4

9 回答 9

46

检查这个

ps aux | grep "aa.sh"
于 2013-05-30T06:37:23.033 回答
37

最简单有效的解决方案是:

pgrep -fl aa.sh
于 2014-02-15T21:18:01.457 回答
12

添加到上面的答案 -

要在脚本中使用,请使用以下内容:-

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
于 2014-02-15T21:12:35.903 回答
5

上面的解决方案非常适合交互式使用,您可以在其中观察结果并以这种方式清除误报。

如果可执行文件本身恰好匹配,或者任何不是脚本名称的参数匹配,则可能会出现误报 - 没有文件扩展名的脚本的可能性更大。

这是一个更强大的脚本解决方案,使用shell 函数

getscript() {
  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
  • 匹配区分大小写(在 macOS 上,您可以添加-ipgrep调用以使其区分大小写;Linux 上,这不是一个选项。)
  • getscript函数还适用于包含文件名组件的完整或部分路径;部分路径不能以部分路径开头,/并且指定的每个组件都必须是完整的。指定的路径越“完整”,误报的风险就越低。警告:路径匹配仅在使用路径调用脚本时才有效- 这对于直接调用的 $PATH 中的脚本通常是正确的。
  • 即使这个函数也不能排除所有误报,因为路径可以嵌入空格,但既不ps也不pgrep反映应用于命令行的原始引用。所有的功能保证是任何匹配都不是第一个标记(它是解释器),并且它作为一个单独的 word出现,可选地前面有一个路径。
  • 另一种最小化误报风险的方法是匹配可执行文件名称(即解释器,例如bash)——假设它是已知的;例如
# List instance(s) of a running *bash* script.
getbashscript() {
  pgrep -lf "(^|/)bash( | .*/)$1( |\$)"
}

如果您愿意做出进一步的假设——例如从不包含嵌入空格的脚本解释器路径——可以使正则表达式更具限制性,从而进一步降低误报的风险。

于 2014-02-21T18:53:41.480 回答
5

检查这个

ps -ef | grep shellscripname.sh

您还可以在

ps -ef
于 2016-05-26T07:55:47.010 回答
2

mklement0 的最后一个答案让我深受启发 - 我在每次重新启动时都通过/etc/crontab. 我根据他的回答构建了一个登录脚本,它显示我的程序是否仍在运行。scripts.sh我在每次登录时通过-file执行此.profile操作,以便在每次登录时获得即时通知。

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
于 2015-03-23T20:17:34.230 回答
2
pgrep -f aa.sh 

要对 id 做某事,你可以通过管道处理它。在这里,我杀死了它的所有子任务。

pgrep aa.sh | xargs pgrep -P ${} | xargs kill

如果您想在进程正在运行时执行命令,请执行此操作

pgrep aa.sh && echo Running
于 2015-01-21T00:18:56.257 回答
1

这里有一个快速脚本来测试 shell 脚本是否正在运行

#!/bin/sh

scripToTest="your_script_here.sh"
scriptExist=$(pgrep -f "$scripToTest")
[ -z "$scriptExist" ] && echo "$scripToTest : not running" || echo "$scripToTest : runnning"
于 2020-04-11T21:38:53.110 回答
0

给 ps 一个选项以显示所有进程,例如:

ps -A | grep "myshellscript.sh"

检查http://www.cyberciti.biz/faq/show-all-running-processes-in-linux/了解更多信息

正如评论中提到的 Basile Starynkevitchpgrep是另一种解决方案。

于 2013-05-30T04:40:05.440 回答