【问题标题】:modifying python daemon script, stop does not return OK (but does kill the process)修改python守护程序脚本,停止不返回OK(但确实杀死了进程)
【发布时间】:2015-05-19 23:24:15
【问题描述】:

继之前的 post 之后,该脚本现在可以正确启动和停止 python 脚本(并且仅限于该特定脚本),但不会将 OK 报告回屏幕...

USER="root"
APPNAME="myPythonApp1"
APPBIN="/usr/bin/python"
APPARGS="/usr/local/sbin/app1/app.py"
LOGFILE="/var/log/$APPNAME/error.log"
LOCKFILE="/var/lock/subsys/$APPNAME"

LOGPATH=$(dirname $LOGFILE)

prog=$APPBIN

start() {
        [ -x $prog ] || exit 5
        [ -d $LOGPATH ] || mkdir $LOGPATH
        [ -f $LOGFILE ] || touch $LOGFILE

        echo -n $"Starting $APPNAME: "
        daemon --user=$USER "$APPBIN $APPARGS >>$LOGFILE &"
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $LOCKFILE
        return $RETVAL
}

stop() {
        echo -n $"Stopping $APPNAME: "
        pid=`ps -ef | grep "[p]ython $APPARGS" | awk '{ print $2 }'`
        echo $pid
        kill $pid
        sleep 1
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
        return $RETVAL
}

开始:

启动 indigolinkserver:[OK]

停止:

停止 indigolinkserver:

在我添加的 app.py 中:

[...]
def set_exit_handler(func):
    signal.signal(signal.SIGTERM, func)
[...]

if __name__ == '__main__':

    def on_exit(sig, func=None):
        #print "exit handler triggered"
        sys.exit(1)

set_exit_handler(on_exit)

在命令行我得到打印(当未注释时),但在守护程序脚本中我什么也没得到......有些东西不会回到 RETVAL......它可以修复吗?

有一个post(感谢@robert)关于只能将 killproc 与守护进程一起使用才能产生这种行为?

谢谢!

【问题讨论】:

  • 仅供参考,您在sleep 之后分配RETVAL=$?,因此它将始终具有值“0”,除非由于某种原因sleep 异常终止...

标签: python linux shell daemon


【解决方案1】:

无法让它与退出处理程序一起工作,所以我最终用 .pid 文件代替...

USER="root"
APPNAME="myPythonApp1"
APPBIN="/usr/bin/python"
APPARGS="/usr/local/sbin/app1/app.py"
LOGFILE="/var/log/$APPNAME/error.log"
LOCKFILE="/var/lock/subsys/$APPNAME"

LOGPATH=$(dirname $LOGFILE)

prog=$APPBIN

start() {
        [ -x $prog ] || exit 5
        [ -d $LOGPATH ] || mkdir $LOGPATH
        [ -f $LOGFILE ] || touch $LOGFILE

        echo -n $"Starting $APPNAME: "
        daemon --user=$USER "$APPBIN $APPARGS >>$LOGFILE &"
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $LOCKFILE
        return $RETVAL
}

stop() {
        echo -n $"Stopping $APPNAME: "
        pid=`ps -ef | grep "[p]ython $APPARGS" | awk '{ print $2 }'`
        killproc -p /var/run/$APPNAME.pid
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
        return $RETVAL
}

在python代码中:

if __name__ == '__main__':
    pid = str(os.getpid())
    pidfile = "/var/run/myPythonApp1.pid"

    if os.path.isfile(pidfile):
        print "%s already exists" % pidfile
        #sys.exit()
    else:
    file(pidfile, 'w').write(pid)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2018-06-23
    • 2022-11-15
    相关资源
    最近更新 更多