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

问题描述 投票:0回答:9

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

请指教。

linux shell
9个回答
51
投票

检查这个

ps aux | grep "aa.sh"

45
投票

最简单、最高效的一体化解决方案是:

pgrep -fl aa.sh

或作为条件:

if pgrep -fl aa.sh &>/dev/null; then
    do...
fi

检查:http://www.explainshell.com/explain?cmd=pgrep+-fl+aa.sh


13
投票

添加上面的答案 -

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

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

6
投票

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

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

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

ps -ef | grep shellscripname.sh

您还可以在

5
投票
ps -ef

pgrep -f aa.sh 

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

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

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

pgrep aa.sh && echo Running

我受到 mklement0 最后一个答案的启发 - 我每次重新启动时都会通过 

/etc/crontab

运行一些脚本/小程序。我根据他的答案构建了一个登录脚本,该脚本显示我的程序是否仍在运行。 我在每次登录时通过
scripts.sh
文件执行此

2
投票
,以便在每次登录时获得即时通知。

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

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

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

1
投票
给ps一个选项来显示所有进程,例子是:

ps -A | grep "myshellscript.sh"

查看

0
投票
了解更多信息

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

© www.soinside.com 2019 - 2024. All rights reserved.