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

lea*_*man 26 linux shell

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

请指教.

kri*_*zna 29

检查一下

ps aux | grep "aa.sh"
Run Code Online (Sandbox Code Playgroud)

  • 这可以给你一些惊喜,让我同时给你举两个例子。第一:它也会找到“aaa.sh”,这可能会导致错误。第二:grep 会发现它自己,你必须处理它。Pgrep 是优雅的解决方案。 (4认同)
  • 我们可以使用一个技巧来防止grep显示出来:`ps aux | grep"[a] a.sh"` (2认同)

Gil*_*not 25

最简单的解决方案是:

pgrep -fl aa.sh
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道这是做什么的,[见解释](http://www.explainshell.com/explain?cmd=pgrep+-fl+aa.sh) (10认同)
  • @tutuDajuju:有帮助,谢谢; 略微切线:值得更明确地关注您链接到的服务:http://explainshell.com可以解析任意Unix命令行并解释基于Ubuntu手册页使用的特定选项.以下是解释此答案的显式网址:http://www.explainshell.com/explain?cmd = prefrep + -fl + aa.sh (3认同)

NRJ*_*NRJ 7

添加上面的答案 -

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

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
Run Code Online (Sandbox Code Playgroud)


mkl*_*nt0 5

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

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

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

getscript() {
  pgrep -lf ".[ /]$1( |\$)"
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

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

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


Sau*_*nde 5

检查一下

ps -ef | grep shellscripname.sh
Run Code Online (Sandbox Code Playgroud)

您还可以在以下位置找到运行过程

ps -ef
Run Code Online (Sandbox Code Playgroud)