Мы находимся на этапе тестирования перехода от 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.
Спасибо
Вы упомянули три ошибки. Первые два достаточно просты:
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.