Bash脚本中的pidof问题

时间:2011-08-11 16:40:51

标签: bash if-statement

我为我编写了一个脚本来启动和停止我的Perforce服务器。要关闭服务器,我使用kill -SIGTERM命令和服务器守护程序的PID。它可以正常工作,但我的脚本中有一些关于输出行为的差异。

该脚本如下所示:

#!/bin/sh -e

  export P4JOURNAL=/var/log/perforce/journal
  export P4LOG=/var/log/perforce/p4err
  export P4ROOT=/var/local/perforce_depot
  export P4PORT=1666

  PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

  . /lib/lsb/init-functions

  p4start="p4d -d"
  p4stop="p4 admin stop"
  p4user=perforce

  case "$1" in
  start)
    log_action_begin_msg "Starting Perforce Server"
    daemon -u $p4user -- $p4start;
    echo "\n"
    ;;

  stop)
    echo "BLABLA"
    echo "$(pidof /usr/local/bin/p4d)"
    #daemon -u $p4user -- $p4stop;
    p4dPid="$(pidof /usr/local/bin/p4d)"
    echo $p4dPid
    if [ -z "$(pidof /usr/local/bin/p4d)" ]; then
      echo "ERROR: No Perforce Server running!"
    else
      echo "SUCCESS: Found Perforce Server running!\n\t"
      echo "Shutting down Perforce Server..."
      kill -15 $p4dPid;
    fi
    echo "\n"
    ;;

  restart)
    stop
    start
    ;;

  *)
    echo "Usage: /etc/init.d/perforce (start|stop|restart)"
    exit 1
    ;;

esac

exit 0

p4d正在运行时,stop块按预期工作,但当没有p4d运行带有stop的脚本时,只输出BLABLA和由于echo "$(pidof /usr/local/bin/p4d)"而空新行。永远不会打印出表明没有服务器正在运行的错误消息。我在这里做错了什么?

PS:出于调试原因,部分if [ -z "$(pidof /usr/local/bin/p4d)" ]; then已从if [ -z "$p4dPid" ]; then更改。

编辑:我缩小了问题的范围。如果我不使用p4dPid变量并注释掉行p4dPid="$(pidof /usr/local/bin/p4d)"echo $p4dPid,则会处理if块并打印错误消息。我仍然不知道导致这种行为的原因。

编辑2:问题解决了!

-e中的#!/bin/sh -e导致shell在任何语句返回非零返回值后退出脚本。

2 个答案:

答案 0 :(得分:1)

当您的服务未运行时,命令

echo "$(pidof /usr/local/bin/p4d)"

作为

处理
echo ""

因为pidof没有返回任何字符串。所以命令输出一个空行。

如果您不想要这个空行,那么只需删除此语句,然后在进程未运行时打印出错误消息。

答案 1 :(得分:0)

问题解决了!

-e中的#!/bin/sh -e导致shell在任何返回非零返回值的语句后退出。