Проблема с pidof в скрипте Bash - PullRequest
0 голосов
/ 11 августа 2011

Я написал скрипт для запуска и остановки моего сервера 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 заставляло оболочку выходить из скрипта после любого оператора, возвращающего ненулевое возвращаемое значение.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Когда ваша служба не работает, команда

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

обрабатывается как

echo ""

потому что pidof не вернул ни одной строки. Таким образом, команда выводит пустую строку.

Если вам не нужна эта пустая строка, просто удалите этот оператор, после того как вы напечатаете сообщение об ошибке, когда процесс не запущен.

0 голосов
/ 12 августа 2011

Проблема решена!

-e в #!/bin/sh -e заставляла оболочку завершаться после любого оператора, возвращающего ненулевое возвращаемое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...