使用Shell测试守护进程是否处于活动状态

使用Shell测试守护进程是否处于活动状态,shell,Shell,我有一个log_sender.pl perl脚本,执行该脚本时运行一个守护进程。我想使用Shell进行测试: #!/bin/bash function log_sender() { perl -I $HOME/script/log

我有一个log_sender.pl perl脚本,执行该脚本时运行一个守护进程。我想使用Shell进行测试:

 #!/bin/bash                                                                                                                              

 function log_sender()
 {
     perl -I $HOME/script/log_sender.pl
 }

 (
   [[ "${BASH_SOURCE[0]}" == "${0}" ]] || exit 0
   function check_log_sender()
      {
          if [ "ps -aef | grep -v grep log_sender.pl" ]; then
              echo "PASSED"
              else
              echo FAILED
          fi
     }


     log_sender
     check_log_sender

 )
不幸的是,当我运行此命令时,我的终端变成:

 -bash-4.1$ sh log_sender.sh 
 ...   
 ...
我做错了什么

> if [ "ps -aef | grep -v grep log_sender.pl" ]; then
这肯定不是你想要的。试试这个:

if ps -aef | grep -q 'log_sender\.pl'; then
    ...
在shell脚本中,
if
构造将检查其退出状态的命令作为其参数。在您的代码中,命令是
[
(也称为
test
),您可以在文本字符串
“ps-aef | grep-v grep log_sender.pl”
上运行它,该字符串总是正确的

您可能打算检查
ps-aef
是否输出一行包含
log\u sender.pl
但不包含
grep
;这类似于
ps-aef | grep-v grep | grep'log\u sender\.pl'
,但您可以通过指定一个不包含它自己

grep
-q
选项抑制任何输出;退出代码指示输入是否与正则表达式匹配

perl
调用也不正确;
-I
选项需要一个参数,因此您实际上是在说just
perl
,而您的perl解释器现在正在等待您键入一个perl脚本,以便执行它。显然,该脚本是
log\u sender.pl
,因此您应该简单地删除
-I
>(如果确实需要添加一些Perl库路径以使脚本正常工作,也可以添加一个参数)

最后,如果编写Bash脚本,则应使用Bash执行它

chmod +x log_sender.sh
./log_sender.sh
或者

bash ./log_sender.sh
您使用的
BASH_SOURCE
构造是一种Bashism,因此您的脚本在
sh
下无法正常工作


最后,主逻辑周围的括号是完全冗余的。它们会导致脚本在单独的子shell中运行这些命令,但没有明显的好处。

非常感谢,这正是我打算用grep-v grep结构所做的,同时避免匹配grep。但是您的结构更干净。我注意到n我从bash或使用sh运行它,终端屏幕上不会显示任何内容,但如果我执行CONTROL+D(在Mac中),则结果会显示。。。