Python 脚本作为 Linux 服务/守护进程
- 2024-10-31 08:38:00
- admin 原创
- 55
问题描述:
你好,
我正在尝试让 python 脚本在 (ubuntu) Linux 上作为服务(守护进程)运行。
网络上有几种解决方案,例如:
http://pypi.python.org/pypi/python-daemon/
一个行为良好的 Unix 守护进程很难正确运行,但每个守护程序所需的步骤大致相同。DaemonContext 实例保存程序的行为和配置的进程环境;使用该实例作为上下文管理器进入守护进程状态。
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
然而,因为我想将我的 python 脚本与 ubuntu linux 专门集成,所以我的解决方案是与 init.d 脚本相结合
#!/bin/bash
WORK_DIR="/var/lib/foo"
DAEMON="/usr/bin/python"
ARGS="/opt/foo/linux_service.py"
PIDFILE="/var/run/foo.pid"
USER="foo"
case "$1" in
start)
echo "Starting server"
mkdir -p "$WORK_DIR"
/sbin/start-stop-daemon --start --pidfile $PIDFILE \n --user $USER --group $USER \n -b --make-pidfile \n --chuid $USER \n --exec $DAEMON $ARGS
;;
stop)
echo "Stopping server"
/sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose
;;
*)
echo "Usage: /etc/init.d/$USER {start|stop}"
exit 1
;;
esac
exit 0
在python中:
import signal
import time
import multiprocessing
stop_event = multiprocessing.Event()
def stop(signum, frame):
stop_event.set()
signal.signal(signal.SIGTERM, stop)
if __name__ == '__main__':
while not stop_event.is_set():
time.sleep(3)
我现在的问题是这种方法是否正确。我是否需要处理任何其他信号?它会是一个“行为良好的 Unix 守护进程”吗?
解决方案 1:
假设你的守护进程有某种持续运行的方式(某些事件循环、扭曲等等),你可以尝试使用upstart
。
以下是假设的 Python 服务的 upstart 配置示例:
description "My service"
author "Some Dude <blah@foo.com>"
start on runlevel [234]
stop on runlevel [0156]
chdir /some/dir
exec /some/dir/script.py
respawn
如果你将其保存为 script.conf,那么/etc/init
你只需执行一次
$ sudo initctl reload-configuration
$ sudo start script
你可以用 来停止它stop script
。上面的 upstart 配置项表示在系统重启时启动此服务,并且如果服务死机了也重新启动它。
至于信号处理 - 您的进程应该自然响应SIGTERM
。默认情况下,除非您专门安装了自己的信号处理程序,否则应该处理此问题。
解决方案 2:
Rloton 的答案很好。这里只是做了一点改进,因为我花了很多时间进行调试。我需要做一个新的答案,这样我才能正确格式化。
另外还有几点我花了很长时间才调试出来:
当失败时,首先检查/var/log/upstart/.log
如果您的脚本使用python-daemon实现了守护进程,则不要使用“expect daemon”节。没有“expect”可以工作。我不知道为什么。(如果有人知道原因 - 请发帖!)
另外,请继续检查“initctl 状态脚本”以确保您已启动(启动/运行)。(并在更新 conf 文件时重新加载)
这是我的版本:
description "My service"
author "Some Dude <blah@foo.com>"
env PYTHON_HOME=/<pathtovirtualenv>
env PATH=$PYTHON_HOME:$PATH
start on runlevel [2345]
stop on runlevel [016]
chdir <directory>
# NO expect stanza if your script uses python-daemon
exec $PYTHON_HOME/bin/python script.py
# Only turn on respawn after you've debugged getting it to start and stop properly
respawn
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件