修改 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)
继之前的
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)