2012-12-05 275 views
9

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

my_server.py:

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

新贵配置文件my_server.conf :

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

任何想法如何使它工作?或者任何其他更好的方式来守护脚本?

更新: 我相信问题在于my_server.py。它似乎并没有首先启动网络服务器(方法run_simple())。应该采取哪些步骤来让.py文件由任务处理程序运行,如新贵?

  • 将家当作为一线#!/usr/bin/env python
  • 允许执行权限chmod 755
  • 开始与超级用户权限的守护程序(以绝对确保没有任何权限限制阻止其启动)
  • 确保所有的Python库那里!
  • 还有别的吗?

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

+0

尝试运行级别235并形成你运行服务器的用户你使用4000权限的端口,这需要管理员的权限。 – Denis

+0

我以超级用户身份运行它,并将运行级别更改为235并没有帮助。 – and3p

+0

您的应用程序的依赖项服务可能尚未启动吗?像一些数据库? – tdihp

回答

11

一个简单的方法是使用crontab来做到:

$ crontab -e 

crontab文件就会出现编辑,在最后写了一行:

@reboot python myserver.py 

并退出。现在,每次重新启动后,cron守护进程将运行您的myserver python脚本。

+3

您的建议可能会起作用,但我更喜欢能够启动/停止/重新启动守护进程,而不是在发生崩溃时重新启动整个系统。 – and3p

+1

如果你有兴趣将你的代码变成一个真正的守护进程(我认为它已经存在了,你只需要开始它就可以了),你可以查看http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/在启动的时候) – kaspersky

17

除了gg.kaspersky方法,你也可以把你的脚本转换为“服务”,这样您就可以开始使用或停止:

$ 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 

在这个例子中,我假设你有一个像#一个家当!在/ usr/bin中/ Python的在你的Python文件的头部,这样就可以直接执行它。

最后但并非最不重要的,不要忘了给执行权限给你的Python服务器和服务的脚本:

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

这里的page在那里我学会了这原本(法国)。

干杯。

+0

很好的解释,以创建一个deamon,但正如我的更新建议我相信'脚本'本身有什么问题。 – and3p

+0

@tvuillemin:这个方法对我很有用,但我需要调试我的脚本......我在哪里可以找到守护程序脚本的标准输出和错误输出? – Throoze

4

如果您有启动时启动的supervisor服务,那么编写监督服务要简单得多。

如果程序失败,您甚至可以设置autorestart。