我正在尝试在python中创建一个守护进程.我发现了以下问题,其中有一些我目前正在关注的好资源,但我很好奇为什么需要双叉.我抓住谷歌,发现有足够的资源声明一个是必要的,但不是为什么.
有人提到它是为了防止守护进程获得控制终端.没有第二个叉子怎么做呢?有什么影响?
我有Python脚本bgservice.py,我希望它一直运行,因为它是我构建的Web服务的一部分.即使在我注销SSH后,如何让它连续运行?
我想要一个可以将任意通用脚本或命令转换为守护进程的守护进程.
我想要处理两种常见情况:
我有一个应该永远运行的脚本.如果它死了(或重启),重新启动它.不要让一次运行两个副本(检测副本是否已经在运行并且在这种情况下不启动它).
我有一个简单的脚本或命令行命令,我希望永远重复执行(运行之间的短暂停顿).同样,不要允许一次运行两个脚本副本.
当然,在案例2中围绕脚本编写"while(true)"循环然后为案例1应用解决方案是微不足道的,但更通用的解决方案将直接解决案例2,因为它适用于案例1中的脚本好(你可能只是想更短或没有停顿如果脚本不打算会死(当然,如果剧本真的没有永远不死,则暂停实际上并不重要)).
请注意,解决方案不应涉及将文件锁定代码或PID记录添加到现有脚本中.
更具体地说,我想要一个程序"daemonize",我可以运行
% daemonize myscript arg1 arg2
Run Code Online (Sandbox Code Playgroud)
或者,例如,
% daemonize 'echo `date` >> /tmp/times.txt'
Run Code Online (Sandbox Code Playgroud)
这将保留越来越多的日期列表附加到times.txt.(注意,如果daemonize的参数是一个永远运行的脚本,如上面的情况1那样,那么daemonize仍然会做正确的事情,必要时重新启动它.)然后我可以在我的.login中输入如上所示的命令和/或每小时或每小时一次(取决于我是多么担心它会意外死亡).
注意:daemonize脚本需要记住它正在守护的命令字符串,这样如果再次守护同一个命令字符串,它就不会启动第二个副本.
此外,理想情况下,该解决方案应该适用于OS X和Linux,但欢迎使用其中一种解决方案.
编辑:如果你必须调用它,这很好sudo daemonize myscript myargs.
(如果我认为这一切都错了,或者有快速和肮脏的局部解决方案,我也很乐意听到.)
PS:如果它有用,这里是一个特定于python的类似问题.
而这个回答类似的问题有什么似乎是一个任意脚本的快速和肮脏的妖魔化一个有用的成语:
我在哪里可以找到一个备受推崇的参考资料,详细说明在Unix上正确处理PID文件?
在Unix操作系统上,通常的做法是使用特殊的锁文件"锁定"程序(通常是守护程序):PID文件.
这是一个可预测位置的文件,通常是"/var/run/foo.pid".程序应该在启动时检查PID文件是否存在,如果文件存在,则退出并显示错误.所以这是一种咨询,协作锁定机制.
该文件包含一行文本,是当前持有锁的进程的数字进程ID(因此名称为"PID文件"); 这允许一种简单的方法来自动发送信号到持有锁的进程.
我找不到的是处理PID文件的预期或"最佳实践"行为的良好参考.有各种细微差别:如何实际锁定文件(不要打扰?使用内核?平台不兼容性怎么办?),处理陈旧锁(默默删除它们?何时检查?),何时获取并释放锁等等.
在哪里可以找到一个受人尊敬的,最权威的参考(理想情况是在W. Richard Stevens的水平上)这个小题目?
我很好奇你如何在后台运行python脚本,每60秒重复一次任务.我知道你可以使用&在后台放置一些东西,对这种情况有效吗?
我正在考虑做一个循环,让它等待60秒并重新加载它,但有些事情让人感觉不舒服.
如果这是一个新手问题,我是守护进程的新手.
在其他几个答案中(例如,这个问题),人们建议使用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编写的工具,通常应该作为守护进程运行.打包此工具以进行分发的最佳做法是什么,尤其是如何处理设置文件和守护程序可执行文件/脚本?
相关的是,是否有任何常用的工具可以设置守护进程在开机时运行,以适合给定的平台(即linux上的init脚本,windows 上的服务,osx上的launchd)?
我做了很多谷歌搜索,但没有找到任何东西,所以如果我只是在寻找错误的东西,我真的很抱歉.
我正在编写Ghost实现MIT编程简介,作业5.
作为其中的一部分,我需要确定一串字符是否是任何有效单词的开头.我有一个有效单词列表("wordlist").
更新:我可以使用每次遍历列表的内容,例如Peter的简单建议:
def word_exists(wordlist, word_fragment):
return any(w.startswith(word_fragment) for w in wordlist)
Run Code Online (Sandbox Code Playgroud)
我以前有:
wordlist = [w for w in wordlist if w.startswith(word_fragment)]
Run Code Online (Sandbox Code Playgroud)
(从这里开始)将列表缩小到以该片段开头的有效单词列表,如果wordlist为空,则将其视为丢失.我采用这种方法的原因是我(错误地,见下文)认为这将节省时间,因为后续查找只需搜索较小的列表.
在我看来,这是通过原始词汇表中的每个项目(38,000个单词)检查每个项目的开始.当wordlist被排序时,这似乎很愚蠢,一旦它击中单词片段之后的某些内容,理解就会停止.我试过这个:
newlist = []
for w in wordlist:
if w[:len(word_fragment)] > word_fragment:
# Take advantage of the fact that the list is sorted
break
if w.startswith(word_fragment):
newlist.append(w)
return newlist
Run Code Online (Sandbox Code Playgroud)
但是这个速度大致相同,我认为可能是因为列表推导作为编译代码运行?
然后我认为再次更高效的是列表中的某种形式的二进制搜索,以找到匹配单词的块.这是要走的路,还是我错过了一些非常明显的东西?
显然,在这种情况下,这并不是什么大不了的事,但我刚刚开始编程并且想要正确地做事.
我已经用简单的测试脚本测试了以下建议.虽然Peter的二分搜索/ bisect显然会更好地进行单次运行,但我对缩小列表是否会胜过一系列片段感兴趣.事实上,它没有:
The totals for all strings "p", "py", "pyt", "pyth", "pytho" are as follows: …Run Code Online (Sandbox Code Playgroud) 在Linux中守护python脚本最简单的方法是什么?我需要这适用于Linux的各种风格,所以它应该只使用基于python的工具.
我在Python中有一些[对我的RPi]的任务涉及很多sleep事情:做一些需要一两秒钟或三秒钟的事情,然后等待几分钟或几小时.我希望在睡眠时间内将控制权传递给操作系统(Linux).为此,我应该躲避那些任务.一种方法是使用Python的标准守护程序进程库.
但守护进程并不那么容易理解.根据PEP 3143的基本原理段落,表现良好的守护进程应该执行以下操作.
对于像我这样的Linux/Unix新手,其中一些不是解释.但我想知道为什么我做我做的事.那么这个理由背后的理由是什么?