用于检查shell脚本是否正在运行的Linux命令

时间:2013-05-30 04:37:19

标签: linux shell

如果进程说aa.sh正在运行,那么找到什么是linux命令。 ps命令似乎不起作用,它不显示shell脚本名称。

请告知。

9 个答案:

答案 0 :(得分:27)

检查

ps aux | grep "aa.sh"

答案 1 :(得分:25)

最简单的解决方案是:

pgrep -fl aa.sh

答案 2 :(得分:5)

添加上述答案 -

要在脚本中使用,请使用以下命令: -

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

答案 3 :(得分:4)

检查

ps -ef | grep shellscripname.sh

您还可以在

中找到正在运行的流程
ps -ef

答案 4 :(得分:2)

上述解决方案非常适合交互式使用,您可以通过这种方式观察结果并排除误报。

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

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

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

答案 5 :(得分:2)

pgrep -f aa.sh 

要使用id执行某些操作,请将其管道化。在这里,我杀死了它的所有子任务。

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

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

pgrep aa.sh && echo Running

答案 6 :(得分: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

答案 7 :(得分:1)

这里是一个快速脚本,用于测试shell脚本是否正在运行

#!/bin/sh

scripToTest="your_script_here.sh"
scriptExist=$(pgrep -f "$scripToTest")
[ -z "$scriptExist" ] && echo "$scripToTest : not running" || echo "$scripToTest : runnning"

答案 8 :(得分:0)

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

ps -A | grep "myshellscript.sh"

查看http://www.cyberciti.biz/faq/show-all-running-processes-in-linux/了解详情

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