Мы находимся на стадии тестирования перехода с Amazon на Linux на Ubuntu для некоторых наших серверов. У нас есть моно-приложение, которое запускается как сервис, и на amazon linux box оно работает нормально. Я знаю, что с сервисами между двумя ОС некоторые вещи различаются. Например, в 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.
Спасибо
То, что я закончил тем, что делал, переписывало этот сценарий с помощью новомодной системы.
После руководства здесь
Вот мой код. Очень прямой, чтобы я понял.
description "Wowza to S3 service: copies videos to S3 and updating SQL DB records accordingly. WOWZAtoS3 is written in mono by DevUserName"
author "Greyhammer"
start on filesystem or runlevel [2345]
stop on shutdown
script
export MONO="/usr/bin/mono"
export EXE="/usr/local/WOWZAtoS3/WOWZAtoS3.exe"
echo $ > /var/run/wowza2s3.pid
exec $MONO $EXE
end script
pre-start script
echo "[`date`] WOWZAtoS3 Starting" >> /var/log/wowza2s3.log
end script
pre-stop script
rm /var/run/wowza2s3.pid
echo "[`date`] WOWZAtoS3 Stopping" >> /var/log/wowza2s3.log
end script
Вы упоминаете три ошибки. Первые два достаточно просты:
Starting wowza2s3: /etc/init.d/wowza2s3: line 20: success: command not found
/etc/init.d/wowza2s3: line 20: failure: command not found
success
и failure
команды не являются стандартными. Они - по-видимому, своего рода Linux Amazon определенная вещь. Однако на основе контекста, я могу высказать образованное предположение о том, что они, как предполагается, делают:
(exec $MONO $EXE & echo $! >> "$PID_FILE") && success || failure
Это означает, "выполняет команду и затем выполненный success
если это работало и failure
если это не сделало. Я понятия не имею, почему любой выбрал бы такой замысловатый способ записать это. Насколько я могу сказать, что строка эквивалентна:
(exec $MONO $EXE & echo $! >> "$PID_FILE")
По-видимому, success
и failure
программы просто возвращают a 0
(успех) и не -0
(failure
) значение выхода. Оболочка делает это так или иначе, хотя, который является, почему строка выше должна быть тем же.Без разницы. Если действительно необходимо назвать внешнюю программу для этого, используйте оболочку builtins true
и false
:
(exec $MONO $EXE & echo $! >> "$PID_FILE") && true || false
Следующую ошибку более трудно понять. status
программа является просто символьной ссылкой на /sbin/initctl
. Версия initctl
на Ubuntu не имеет a -p
опция. Я не смог найти руководство что initctl
используется на Amazon Linux. По-видимому, если можно найти его, можно проверить что -p
опция делает и выясняет эквивалент в Ubuntu initctl
.