从 Amazon Linun 迁移到 ubuntu,现在我的初始化脚本不起作用了。

从 Amazon Linun 迁移到 ubuntu,现在我的初始化脚本不起作用了。

我们正处于将部分服务器从 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")

推测起来,successfailure程序只是返回一个0(成功) 和非0( failure) 的退出值。不过,shell 无论如何都会这样做,这就是为什么上面的行应该相同。随便吧。如果您确实需要为此调用外部程序,请使用 shell 内置程序truefalse

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

下一个错误更难理解。该status程序只是 的符号链接/sbin/initctl。Ubuntu 上的 版本initctl没有选项-p。我无法找到initctlAmazon 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

相关内容