修改 python 守护程序脚本,停止不会 return OK(但会终止进程)

modifying python daemon script, stop does not return OK (but does kill the process)

继之前的 之后,该脚本现在可以正确启动和停止 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  }'`
        echo $pid
        kill $pid
        sleep 1
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
        return $RETVAL
}

开始:

Starting indigolinkserver: [ OK ]

正在停止:

Stopping 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 与守护进程一起使用才能产生这种行为?

谢谢!

无法让它与退出处理程序一起工作,所以我最终改用 .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  }'`
        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)