我有简单的Python脚本,可以作为守护进程使用.我正在尝试创建systemd脚本,以便能够在启动期间启动此脚本.
当前的systemd脚本:
[Unit]
Description=Text
After=syslog.target
[Service]
Type=forking
User=node
Group=node
WorkingDirectory=/home/node/Node/
PIDFile=/var/run/zebra.pid
ExecStart=/home/node/Node/node.py
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
node.py:
if __name__ == '__main__':
with daemon.DaemonContext():
check = Node()
check.run()
Run Code Online (Sandbox Code Playgroud)
run包含while True循环.
我尝试运行此服务systemctl start zebra-node.service.不幸的是服务从未完成陈述序列 - 我必须按Ctrl + C. 脚本正在运行,但状态正在激活,一段时间后它将更改为停用状态.现在我正在使用python-daemon(但在没有它尝试之前,症状相似).
我应该为我的脚本实现一些额外的功能还是systemd文件不正确?
如果这是一个新手问题,我是守护进程的新手.
在其他几个答案中(例如,这个问题),人们建议使用python-daemon包,因为它完全实现了PEP 3143标准.
不幸的是,python-daemon 在文档上有点亮(或者更有可能我对知识/经验有点轻视......;)),我想我可能遗漏了一些非常基本的东西.这是我正在做的事情:
我有以下内容:
import daemon
logfile = open('daemon.log', 'w')
context = daemon.DaemonContext(stdout = logfile, stderr = logfile)
context.open()
with context:
do_something_1()
do_something_2()
Run Code Online (Sandbox Code Playgroud)
问题:如何使用python-daemon设置守护进程,如何启动并停止它?
附注:
我基本上猜测这个.open()方法应该如何/是否应该在这里使用 - 文档在这一点上并不是很明确.无论我是否包括它,似乎都会发生同样的事情.
所以,现在我该怎么办?当我尝试运行此文件时,例如:
python startConsumerDaemons.py
Run Code Online (Sandbox Code Playgroud)
它似乎运行do_something_1(),但不是第二个.而且,它似乎离开程序连接到终端窗口.IE,stdout没有重定向,当我关闭终端窗口时,进程被终止.所以,我很确定我在这里做错了什么......我应该做些什么呢?
最后,一旦我让守护进程运行,我该如何停止/重启它(例如,如果我对底层代码进行了更改)?
我试图使用python-daemon库,在我看来这是创建守护进程而不忘记任何东西最安全的方法.文件很差,只是PEP 3143.
另一方面,我发现了许多链接到Sander Marechal的Python中的一个简单的unix/linux守护进程.这看起来是一个更好的解决方案,或者我还没有尝试过使用它.
编辑:我使用过Sander Marechal的解决方案,它似乎很好用.
那么Python社区中创建一个守护进程的事实上的方法是什么呢,它是这些库中的一个,还是只是自己完成(分两次等)?
此外,您会认为任何带有PEP的库都是更好的选择,因为它比任何其他解决方案更接近创建守护进程(或至少更标准的方式)的综合方式.那么这个python-daemon包的处理是什么,它是否会包含在标准库中?
我正在使用mod_wsgi通过Apache为django站点提供服务.我还有一些Python代码作为后台进程运行(dameon?).它不断轮询服务器并将数据插入其中一个Django模型.这工作正常,但我可以将此代码作为我的Django应用程序的一部分,但能够在后台持续运行吗?它不需要是一个过程本身,而是一个不断活跃的Django网站的艺术.如果是这样,你能指点我一个例子或一些文件来帮助我实现这个目标吗?
谢谢.
我安装了python-daemon,现在我正在尝试正确处理信号.我的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import signal, time, syslog
import daemon
def runDaemon():
context = daemon.DaemonContext()
context.signal_map = { signal.SIGTERM: programCleanup }
context.open()
with context:
doMainProgram()
def doMainProgram():
while True:
syslog.syslog("pythonDaemon is running")
time.sleep(5)
def programCleanup():
syslog.syslog("pythonDaemon STOP")
if __name__ == "__main__":
runDaemon()
Run Code Online (Sandbox Code Playgroud)
当我启动代码时,一切都按预期工作:正在运行的文本pythonDaemon/var/log/syslog每5秒写一次.但是当我想终止守护进程时kill -TERM *PID*守护进程被终止但是syslog中缺少文本pythonDaemon STOP.
我究竟做错了什么?
注意:我没有在from daemon import runner这里工作,因为这给了我一个错误(看起来我需要一个旧版本lockfile),我不会解决这个问题,除非它是唯一能够正确处理信号的可能性.
我正在尝试守护我的应用程序并收到错误:
out: with daemon.DaemonContext():
out: AttributeError: 'module' object has no attribute 'DaemonContext'
Run Code Online (Sandbox Code Playgroud)
看起来其他人从未安装的模块中收到此错误.作为Python的新手,有一个令人困惑的是有一个守护进程和python-daemon包,还有两种安装python包的方法(sudo apt-get install和sudo pip install).但是,似乎我安装了包.我在Ubuntu 10.04上安装了Python 2.6.有任何想法吗?
看起来我安装了模块:
# pip freeze
LEPL==5.0.0
MySQL-python==1.2.2
distribute==0.6.10
lockfile==0.8
matplotlib==0.99.1.1
numpy==1.3.0
pyparsing==1.5.2
python-apt==0.7.94.2ubuntu6.4
python-daemon==1.5.2
python-dateutil==1.4.1
pytz==2010b
rpy2==2.0.8
wsgiref==0.1.2
Run Code Online (Sandbox Code Playgroud)
更多证据表明该模块已安装:
$ python
>>> import daemon
>>> dir(daemon)
['DaemonContext', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '_copyright', '_license', '_url', '_version', 'daemon', 'version']
Run Code Online (Sandbox Code Playgroud) 如何使用setuptools打包Python应用程序,以便在安装时(例如通过setup.py或pip),将守护程序脚本放在适当的位置,启动它,并将其标记为在引导时自动启动?
在我的例子中,我的代码只适用于Linux,所以我只关心在Linux环境(特别是Ubuntu)中安装守护进程.
我发现了几篇 描述如何轻松创建Python守护进程的帖子 ,但我似乎无法找到任何描述如何在生产环境中安装它们的内容,以便将它们视为任何其他正常的守护进程或服务.
我知道Ubuntu和其他一些发行版将他们的守护进程保存在/etc/init.d中,我知道如何使用setuptools将文件复制到文件系统上的特定位置,因此将我的脚本复制或符号链接到/ etc /是安全的init.d然后运行chkconfig来设置它的运行时,还是有更安全的分发中立方式安装守护进程?
努力尝试使用Python 3.3.4使python守护进程工作.我使用PyPi的最新版本的python-daemon-3K,即1.5.8
起点是以下代码:如何在Python中创建守护进程?我认为代码是2.x Python.
import time
from daemon import runner
class App():
def __init__(self):
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
self.pidfile_path = '/tmp/foo.pid'
self.pidfile_timeout = 5
def run(self):
while True:
print("Howdy! Gig'em! Whoop!")
time.sleep(10)
app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
Run Code Online (Sandbox Code Playgroud)
试图运行此我得到以下错误.
python mydaemon.py start
Traceback(最近一次调用last):文件"mydaemon.py",第60行,在daemon_runner = runner.DaemonRunner(app)文件"/depot/Python-3.3.4/lib/python3.3/site -packages/python_daemon_3K-1.5.8-py3.3.egg/daemon/runner.py",第89行,在init app.stderr_path中,'w +',buffering = 0)ValueError:不能有无缓冲的文本I/O
任何指针如何翻译以使用Python 3.3.4或在python-daemon-3K中使用runner的好例子
谢谢德里克
我正在尝试在python中创建一个守护进程,我遇到了python-daemon包.有趣的是,我看到它使用的最常见的方式甚至不是那些非常稀疏的文档告诉你做的事情
import os
import grp
import signal
import daemon
import lockfile
from spam import (
initial_program_setup,
do_main_program,
program_cleanup,
reload_program_config,
)
context = daemon.DaemonContext(
working_directory='/var/lib/foo',
umask=0o002,
pidfile=lockfile.FileLock('/var/run/spam.pid'),
)
context.signal_map = {
signal.SIGTERM: program_cleanup,
signal.SIGHUP: 'terminate',
signal.SIGUSR1: reload_program_config,
}
mail_gid = grp.getgrnam('mail').gr_gid
context.gid = mail_gid
important_file = open('spam.data', 'w')
interesting_file = open('eggs.data', 'w')
context.files_preserve = [important_file, interesting_file]
initial_program_setup()
with context:
do_main_program()
Run Code Online (Sandbox Code Playgroud)
相反,人们使用它像这样:
#!/usr/bin/python
import time
from daemon import runner
class App():
def __init__(self):
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path …Run Code Online (Sandbox Code Playgroud) python ×10
python-daemon ×10
daemon ×7
linux ×2
daemons ×1
django ×1
monit ×1
python-2.7 ×1
setuptools ×1
systemd ×1
upstart ×1