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

标签 python upstart werkzeug

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

我的服务器.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 中。它似乎并没有首先启动网络服务器(方法 run_simple())。应该采取什么步骤来使 .py 文件被 Upstart 等任务处理程序运行?

  • 将 shebang 放在第一行 #!/usr/bin/env python
  • 允许执行权限chmod 755
  • 以 super 用户权限启动守护程序(绝对确保没有权限限制阻止它启动)
  • 确保所有 python 库都在那里!
  • 还有其他事情吗?

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

最佳答案

除了 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

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

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

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

这是 page我最初是从哪里学的(法语)。

干杯。

关于python - 在启动时将 python 脚本作为守护进程运行 (Ubuntu),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13718821/

相关文章:

python - 将两个数据帧连接到第二个数据帧内的值

Python:如何将 .txt 文件的第一列大写。

node.js - Upstart 和 init.d 优先级

python - 等待值然后停止服务器,在 'werkzeug.server.shutdown' 被弃用并删除之后

python - 匹配在下一次出现第一个特定行之前没有跟随另一个特定行的特定行

Python - 与 __contains__ 相反

ubuntu - Upstart :作业启动失败

mongodb 3.0.3 Ubuntu 14.04.2 AWS m3.medium Upstart PID 不匹配

python - 发布 JSON 和 python Flask - 使用 Werkzeug 调试器的任何技术?

python - 使用 Werkzeug 的 Django 交互式回溯, `manage.py runserver_plus` 错误