我们正处于将部分服务器从 amazon linux 迁移到 ubuntu 的测试阶段。我们有一个作为服务运行的 mono 应用程序,它在 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
您提到了三个错误。前两个很简单:
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")
推测起来,success
和failure
程序只是返回一个0
(成功) 和非0
( failure
) 的退出值。不过,shell 无论如何都会这样做,这就是为什么上面的行应该相同。随便吧。如果您确实需要为此调用外部程序,请使用 shell 内置程序true
和false
:
(exec $MONO $EXE & echo $! >> "$PID_FILE") && true || false
下一个错误更难理解。该status
程序只是 的符号链接/sbin/initctl
。Ubuntu 上的 版本initctl
没有选项-p
。我无法找到initctl
Amazon Linux 上使用的任何内容的手册。假设,如果您能找到它,您可以检查该-p
选项的作用并找出 Ubuntu 中的等效选项initctl
。
答案2
我最终使用 upstart 系统重写了这个脚本。
遵循指南这里
这是我的代码。对我来说非常容易理解。
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