使用Shell测试守护进程是否存在

时间:2013-07-22 05:16:07

标签: shell

我有一个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 
 ...   
 ...

我做错了什么?

1 个答案:

答案 0 :(得分:1)

> 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_sender.pl但不包含grep的行;这可能类似ps -aef | grep -v grep | grep 'log_sender\.pl',但您可以通过指定与自身不匹配的正则表达式来避免额外的grep -v

-q的{​​{1}}选项会抑制任何输出;退出代码表示输入是否与正则表达式匹配。

grep调用也不正确; perl选项需要一个参数,所以你只是有效地说-I,你的Perl解释器现在正在等你输入一个Perl脚本来执行它。显然脚本是perl所以你应该简单地删除log_sender.pl(或者添加一个参数,如果你真的需要添加一些Perl库路径以使脚本工作)。

最后,如果你编写一个Bash脚本,你应该用Bash执行它。

-I

或者

chmod +x log_sender.sh
./log_sender.sh

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

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