Служба Ubuntu с запуском хвоста

Мне удалось создать собственный скрипт службы, но у него возникли проблемы. Из службы я вызываю следующий скрипт в /usr/bin/myscript.sh:

#!/bin/bash tail -f /path/to/error.log|while read LINE;do if grep -q "Fatal" <(echo $LINE); then ( echo "From: noreply@example.com" echo "To: inbox@example.com" echo "Subject: PHP Error (URGENT!)" echo $LINE ) | sendmail -t fi done

Сам сценарий прекрасен, так как при его запуске он работает вручную. Однако при запуске службы, которая вызывает сценарий, она фактически не запускается и не запускается на фоне. Я думаю, что это имеет какое-то отношение к текущему циклу while, но я просто стартер в сценариях оболочки.

У меня есть следующее в /etc/init.d/myscript

#! /bin/sh ### BEGIN INIT INFO # Provides: myscript # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: myscript shortdesc # Description: myscript longdesc ### END INIT INFO PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="myscript desc" NAME=myscript DAEMON=/usr/bin/$NAME.sh DAEMON_ARGS="--options args" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME [ -x "$DAEMON" ] || exit 0 [ -r /etc/default/$NAME ] && . /etc/default/$NAME . /lib/init/vars.sh . /lib/lsb/init-functions do_start() { start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS \ || return 2 } do_stop() { start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 rm -f $PIDFILE return "$RETVAL" } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; *) log_end_msg 1 ;; esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 exit 3 ;; esac :

I также запускал update-rc.d, когда я запускаю службу (service myscript start), она дает тот же результат, что и я сам запускаю скрипт, он просто пуст (поскольку скрипт ничего не выводит). Я думаю, что он вызывает сценарий, но не запускает его в фоновом режиме.

Оба файла также были изменены.

Я добавил exec > /tmp/log 2>&1 к началу сценария для отладки в соответствии с запросом в комментариях, однако файл выглядит пустым.

Мы используем Ubuntu 14.04 LTS.

0
задан 5 April 2017 в 13:48

3 ответа

Итак, я исправил проблему, все, что мне нужно было сделать, это добавить & после завершения. Это все исправило. Спасибо всем за помощь.

#!/bin/bash tail -f /path/to/error.log|while read LINE;do if grep -q "Fatal" <(echo $LINE); then ( echo "From: noreply@example.com" echo "To: inbox@example.com" echo "Subject: PHP Error (URGENT!)" echo $LINE ) | sendmail -t fi done &
1
ответ дан 18 July 2018 в 15:30

Итак, я исправил проблему, все, что мне нужно было сделать, это добавить & после завершения. Это все исправило. Спасибо всем за помощь.

#!/bin/bash tail -f /path/to/error.log|while read LINE;do if grep -q "Fatal" <(echo $LINE); then ( echo "From: noreply@example.com" echo "To: inbox@example.com" echo "Subject: PHP Error (URGENT!)" echo $LINE ) | sendmail -t fi done &
1
ответ дан 24 July 2018 в 20:39
  • 1
    & Quot; он фактически не запускается и не запускается на фоне & quot; поэтому, когда вы это сказали, вы имели в виду, что это действительно началось, но это не пошло на задний план? – muru 6 April 2017 в 12:10
  • 2
    Да, я мог ошибочно сформулировать это. Мои извинения. – WesselV 6 April 2017 в 14:54

Итак, я исправил проблему, все, что мне нужно было сделать, это добавить & после завершения. Это все исправило. Спасибо всем за помощь.

#!/bin/bash tail -f /path/to/error.log|while read LINE;do if grep -q "Fatal" <(echo $LINE); then ( echo "From: noreply@example.com" echo "To: inbox@example.com" echo "Subject: PHP Error (URGENT!)" echo $LINE ) | sendmail -t fi done &
1
ответ дан 31 July 2018 в 23:40
  • 1
    & Quot; он фактически не запускается и не запускается на фоне & quot; поэтому, когда вы это сказали, вы имели в виду, что это действительно началось, но это не пошло на задний план? – muru 6 April 2017 в 12:10
  • 2
    Да, я мог ошибочно сформулировать это. Мои извинения. – WesselV 6 April 2017 в 14:54

Другие вопросы по тегам:

Похожие вопросы: