如何使用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-daemon,并且遇到的问题是,当我kill -9进行处理时,它会留下一个pid文件(ok),并且下次运行我的程序时它不起作用,除非我已经手动删除了pidfile(不是好).
我按照context.close()在终止之前调用的顺序捕获所有异常- 当发生这种情况时(例如在a上kill),删除/var/run/mydaemon.pid*文件并且后续守护程序运行成功.但是,使用SIGKILL(kill -9)时,我没有机会调用context.close(),并且/ var/run文件仍然存在.在这个例子中,下次我运行我的程序时它没有成功启动 - 原始进程返回,但是守护进程阻塞了context.open().
似乎python-daemon应该注意到有一个不再存在的进程的pidfile,并清除它,但这不会发生.我应该用手做这个吗?
注意:我没有使用,with因为此代码在Python 2.4上运行
from daemon import DaemonContext
from daemon.pidlockfile import PIDLockFile
context = DaemonContext(pidfile = PIDLockFile("/var/run/mydaemon.pid"))
context.open()
try:
retry_main_loop()
except Exception, e:
pass
context.close()
Run Code Online (Sandbox Code Playgroud) 我正在实施rabbitMQ,有超过3名工人处理.为了测试它,我需要每次都执行worker文件,但我不希望这样.
我希望我的工作脚本能够连续监听所有请求,而无需手动执行工作文件.很多人建议CRON,但我不想要因为如果以前的运行还没有结束,那么重叠可能会导致严重的问题.
有没有办法在后台连续运行我的工作脚本?
我想用python编写一个抓取器,抓取一些网址并抓取并保存数据.我知道怎样才能把它写成一个简单的程序.我正在寻找一种方法将其部署在我的虚拟服务器(运行ubuntu)作为服务,以使其不间断爬行.谁能告诉我怎么办?
我有一个基于Python的程序,我想作为一个守护进程运行.目前我正在以一种非常hackish的方式开始使用会话并使用它来杀死它.screen-d -m namepkill -9 -f name
最终我要把它移到我们在这里使用的更好的系统(因此我不愿意修改程序)但是在此期间,我正在寻找一种更清洁的方法来做到这一点.
我目前的想法是从inti.d脚本作为后台任务开始,但是如何编写该部件以使其恢复原状?
我有一个程序可以从某些Web页面中删除某些数据,当Web页面发生变化时,就会采取相应的行动.
如何设置程序以便继续在后台运行?
我不需要任何细节
我对这个概念感到很困惑,并会感激任何人提供的任何帮助.
所以我一直在尝试创建一个在后台运行服务器的进程,并使用守护进程启动它.所以我的代码是:
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):
server = WSGIServer(('localhost',28080),handle_request)
server.serve_forever()
if __name__ == '__main__':
app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
Run Code Online (Sandbox Code Playgroud)
但是,这给了我错误:
[warn] Epoll ADD(1) on fd 5 failed. Old events were 0; read change was 1 (add); write change was 0 (none): Invalid argument
Traceback (most recent call last):
File "enrollmentrunner2.py", line 110, in <module>
daemon_runner.do_action()
File "/usr/lib/python2.7/dist-packages/daemon/runner.py", line 186, in do_action
func(self) …Run Code Online (Sandbox Code Playgroud) 我有一个小的python脚本,可以创建从MySQL中提取的数据图.我正试图找出一种在后台运行脚本的方法.我尝试过很多东西:
这些都有优点和缺点:
有人能指出我的方法来充分利用所有这些方法吗?
我有一个用Python编写的线程服务器,我开始使用以下shell脚本:
#!/bin/bash
base_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
public_dns=$(curl -s http://169.254.169.254/latest/meta-data/public-hostname)
echo $public_dns > "$base_path/client/address"
cd "$base_path/server"
python "server.py" &
echo $! > "$base_path/server_pid"
echo "Server running"
Run Code Online (Sandbox Code Playgroud)
我将PID回显到一个文件,以便我可以使用另一个shell脚本关闭服务器:
#!/bin/bash
base_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
kill -9 `cat "$base_path/server_pid"`
rm "$base_path/server_pid"
rm "$base_path/client/address"
Run Code Online (Sandbox Code Playgroud)
但是,我知道这是一个糟糕的方法,考虑到服务器有许多线程具有进入网络和硬盘的I/O ......所以我想做的是让第二个脚本以某种方式与服务器交互并告诉它启动一个关闭序列,它将干净地关闭所有线程,关闭和存档日志等.
现在我知道atexit,我用这种方式测试了它:
import atexit
def byebye(o):
o.write('stop')
o.flush()
o.close()
o = open('log','w')
o.write('start')
o.flush()
atexit.register(byebye, o)
while True:
pass
Run Code Online (Sandbox Code Playgroud)
但是,当我kill -9的过程,byebye()是不是被解雇了.我应该使用除了全能者kill -9 …
我正在使用此处或此处引用的著名代码在 Python 中执行守护程序,如下所示:
import sys, daemon
class test(daemon.Daemon):
def run(self):
self.db = somedb.connect() # connect to a DB
self.blah = 127
with open('blah0.txt', 'w') as f:
f.write(self.blah)
# doing lots of things here, modifying self.blah
def before_stop(self):
self.db.close() # properly close the DB (sync to disk, etc.)
with open('blah1.txt', 'w') as f:
f.write(self.blah)
daemon = test(pidfile='_.pid')
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.before_stop() # AttributeError: test instance has no attribute …Run Code Online (Sandbox Code Playgroud)