在启动时运行python脚本作为守护程序(Ubuntu)



我已经使用werkzeug创建了小型web服务器,并且能够使用python my_server.py以通常的python方式运行它。页面加载,一切正常。现在我想在我的电脑启动时启动它。最简单的方法是什么?我一直在与暴发户作斗争,但它似乎并没有"生活在后台",因为在我执行start my_server后,我立即收到kernel: [ 8799.793942] init: my_server main process (7274) terminated with status 1

my_server.py:

...
if __name__ == '__main__':
from werkzeug.serving import run_simple
app = create_app()
run_simple('0.0.0.0', 4000, app)

upstart配置文件my_server.conf:

description "My service"
author  "Some Dude <blah@foo.com>"
start on runlevel [2345]
stop on runlevel [016]
exec /path/to/my_server.py
start on startup

有什么想法吗?或者有其他更好的方法来守护脚本吗?

更新:我认为问题出在my_server.py内部。它似乎一开始就没有启动Web服务器(方法run_simple())。应该采取哪些步骤使.py文件由诸如upstart之类的任务处理程序运行?

  • 将shebang作为第一行#!/usr/bin/env python
  • 允许执行权限chmod 755
  • 使用超级用户权限启动守护进程(确保没有权限限制阻止它启动)
  • 确保所有python库都在那里
  • 还有别的吗

已解决:问题是缺少python依赖项。当通过任务管理器(例如upstartstart-stop-daemon)启动脚本时,不会引发错误。需要绝对确定pythonpath包含了您需要的一切。

除了gg.caspersky方法,您还可以将脚本变成一个"服务",这样您就可以使用启动或停止它

$ sudo service myserver start
* Starting system myserver.py Daemon                          [ OK ]
$ sudo service myserver status
* /path/to/myserver.py is running
$ sudo service myserver stop
* Stopping system myserver.py Daemon                          [ OK ]

并使用将其定义为启动服务

$ sudo update-rc.d myserver defaults

要做到这一点,您必须创建此文件并将其保存在/etc/init.d/.中

#!/bin/sh -e
DAEMON="/path/to/myserver.py"
DAEMONUSER="myuser"
DAEMON_NAME="myserver.py"
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
test -x $DAEMON || exit 0
. /lib/lsb/init-functions
d_start () {
log_daemon_msg "Starting system $DAEMON_NAME Daemon"
start-stop-daemon --background --name $DAEMON_NAME --start --user $DAEMONUSER --exec $DAEMON
log_end_msg $?
}
d_stop () {
log_daemon_msg "Stopping system $DAEMON_NAME Daemon"
start-stop-daemon --name $DAEMON_NAME --stop --retry 5 --name $DAEMON_NAME
log_end_msg $?
}
case "$1" in
start|stop)
d_${1}
;;
restart|reload|force-reload)
d_stop
d_start
;;
force-stop)
d_stop
killall -q $DAEMON_NAME || true
sleep 2
killall -q -9 $DAEMON_NAME || true
;;
status)
status_of_proc "$DAEMON_NAME" "$DAEMON" "system-wide $DAEMON_NAME" && exit 0 || exit $?
;;
*)
echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}"
exit 1
;;
esac
exit 0

在这个例子中,我假设你有一个类似#的shebang/usr/bin/python位于您的python文件的头部,这样您就可以直接执行它。

最后但同样重要的是,不要忘记将执行权限授予您的python服务器和服务脚本:

$ sudo chmod 755 /etc/init.d/myserver
$ sudo chmod 755 /path/to/mserver.py

这是我最初学习法语的地方。

干杯。

一种简单的方法是使用crontab:

$ crontab -e

将出现一个crontab文件进行编辑,在末尾写下一行:

@reboot python myserver.py

然后退出。现在,每次重新启动后,cron守护进程都会运行myserverpython脚本。

如果您有在启动时启动的主管服务,那么编写一个主管服务要简单得多。

如果程序失败,您甚至可以设置自动重启。

相关内容

最新更新