Переходя от Amazon Linun к ubuntu, теперь мой сценарий инициализации не работает.

Мы находимся на этапе тестирования перехода от amazon linux к ubuntu для некоторых наших серверов. У нас есть моно приложение, которое запускается как служба, и в ящике amazon linux он работает нормально. Я знаю, что некоторые вещи отличаются от услуг между двумя ОС. Например, на Amazon Linux библиотека исходных функций находится в другом месте.

Я не писал это приложение или сценарий инициализации, его просто моя работа, чтобы заставить его работать сейчас. Можете ли вы помочь мне запустить этот скрипт? Вот мой скрипт

#!/bin/bash
# /etc/init.d/wowza2s3

#source function library for Amazon Linux 
#. /etc/rc.d/init.d/functions 

#source function library for Ubuntu
. /lib/lsb/init-functions

RETVAL=0
prog=wowza2s3
lockfile=/var/lock/subsys/$prog

MONO=/usr/bin/mono
EXE=/usr/local/WOWZAtoS3/WOWZAtoS3.exe
PID_FILE=/var/run/wowza2s3.pid

start()
{
        echo -n $"Starting $prog: "
    (exec $MONO $EXE & echo $! >> "$PID_FILE") && success || failure
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch $lockfile
        echo
        return $RETVAL
}
stop()
{
        if [ ! -f "$PID_FILE" ]; then
                action $"Stopping $prog: " /bin/true
                return 0
        fi
        PID=`cat "$PID_FILE"`
        if [ -n "$PID" ]; then
                /bin/kill "$PID" >/dev/null 2>&1
                RETVAL=$?
                if [ $RETVAL -ne 0 ]; then
                        RETVAL=1
                        action $"Stopping $prog: " /bin/false
                else
                        action $"Stopping $prog: " /bin/true
                fi
        else
                 # failed to read pidfile
                action $"Stopping $prog: " /bin/false
                RETVAL=4
        fi

        if [ "x$runlevel" = x0 -o "x$runlevel" = x6 ] ; then
            trap '' TERM
            killall $prog 2>/dev/null
            trap TERM
        fi
        [ $RETVAL -eq 0 ] && rm -f $lockfile
        rm -f "$PID_FILE"
        return $RETVAL
}
restart() {
    stop
    start
}
force_reload() {
    restart
}

rh_status() {
        status -p $PID_FILE mono
}

rh_status_q() {
        rh_status >/dev/null 2>&1
}


case "$1" in
        start)
                rh_status_q && exit 0
                start
                ;;
        stop)
                if ! rh_status_q; then
                        rm -f $lockfile
                        exit 0
                fi
                stop
                ;;
        restart)
                restart
                ;;
    force_reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
esac
exit $RETVAL

в настоящее время, когда я запускаю service wowza2s3 start, он возвращает

root@ip-10-0-1-10:~# service wowza2s3 start
Starting wowza2s3: /etc/init.d/wowza2s3: line 20: success: command not found
/etc/init.d/wowza2s3: line 20: failure: command not found 

, хотя он запускает приложение, и он работает по назначению.

service wowza2s3 stop ничего не возвращает и не останавливает процесс

service wowza2s3 status возвращает

root@ip-10-0-1-10:~# service wowza2s3 status
status: invalid option: -p
Try `status --help' for more information.

Спасибо

1
задан 25 March 2016 в 00:58

1 ответ

Вы упомянули три ошибки. Первые два достаточно просты:

Starting wowza2s3: /etc/init.d/wowza2s3: line 20: success: command not found
/etc/init.d/wowza2s3: line 20: failure: command not found 

Команды success и failure не являются стандартными. Это, по-видимому, какая-то особенность Amazon Linux. Однако, исходя из контекста, я могу сделать обоснованное предположение о том, что они должны делать:

(exec $MONO $EXE & echo $! >> "$PID_FILE") && success || failure

Это означает «выполнить команду, а затем запустить success, если она сработала, и failure, если бы это не так. Я понятия не имею, почему кто-то выбрал такой запутанный способ записи. Насколько я могу судить, эта строка эквивалентна:

(exec $MONO $EXE & echo $! >> "$PID_FILE")

Предположительно, f9] и failure просто возвращают значение выхода 0 (успех) и не 0 (failure). В любом случае оболочка делает это, поэтому строка, указанная выше, должна быть одинаковой. Если вам действительно нужно вызвать внешнюю программу для этого, используйте встроенные оболочки true и false:

(exec $MONO $EXE & echo $! >> "$PID_FILE") && true || false

Следующая ошибка сложнее понять. Программа status - это просто symlink на /sbin/initctl. Версия initctl на Ubuntu не имеет опции -p. Я не смог найти руководство о том, что initctl используется на Amazon Linux. Предположительно, если вы можете найдите его, вы можете проверить, что делает опция -p, и вычислить эквивалент в Ubuntu initctl.

0
ответ дан 23 May 2018 в 12:37
  • 1
    Как насчет того, почему остановка не останавливает обслуживание? Это потому, что в начале не создается файл pid? – Greyhammer 26 March 2016 в 04:40
  • 2
    @Greyhammer нет, это потому, что опция -p для status не существует, поэтому выполняется if ! rh_status_q; then rm -f $lockfile; exit 0, поэтому сценарий завершается до запуска функции stop. – terdon♦ 26 March 2016 в 18:11
  • 3
    Поэтому я вошел в ящик AWS Linux и обнаружил, что у службы нет -p pastebin.com/raw/KzMHwGua – Greyhammer 28 March 2016 в 16:36
  • 4
    @Greyhammer не service, это ваш initctl, который имеет его (status является ссылкой на initctl). – terdon♦ 28 March 2016 в 16:40
  • 5
    моя ошибка, я опечатал, первый pastbin от initctl вот статус pastebin.com/raw/4ymjxZAU – Greyhammer 28 March 2016 в 16:41

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

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