为了保持守护进程的运行,防止它消耗所有资源,避免让僵尸进程困扰您的系统,需要进行大量的簿记工作,等等

下面是我们运行的最简单守护进程的简化版本(它使许多工作进程保持运行和循环)。它呼唤着commandq.run_命令()做实际工作(不包括在内)。在

如果你能用一个更简单的cron作业(你需要一个cron作业或类似的作业来验证守护进程是否正在运行)。在import os, sys, time, argparse, random, signal

import multiprocessing

import psutil

# originally from http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

# now at https://gist.github.com/dcai/1075904/6f7be00f7f411d5c2e7cd1691dcbb68efacb789c

import daemon

def _ensure_dir(*pth):

path = os.path.join(*pth)

if os.path.exists(path):

if not os.path.isdir(path):

raise RuntimeError("%r is not a directory!" % path)

else:

os.makedirs(path, 0775)

return path

PID_DIRECTORY = _ensure_dir('/var/run/commandq/')

PID_FNAME = 'commandq-worker.pid'

PID_FILE = os.path.join(PID_DIRECTORY, PID_FNAME)

def worker(args, parentpid):

"""Command Queue worker process.

"""

# number of tasks to process before dying (we can't just keep looping

# in case the client code has resource leaks..)

recycle = args.recycle

def sleep_or_die(n=0):

"""If our parent died (or got killed), we commit suicide.

(this is much easier than trying to kill sub-treads from the

parent).

"""

# os.getppid() only exists on Linux..

if os.getppid() != parentpid: # i.e. parent died

sys.exit()

# back off if the system is busy (i.e. don't cause a death spiral..)

if psutil.cpu_percent() > 70.0:

time.sleep(25)

if os.getppid() != parentpid: # check that parent didn't die

sys.exit()

if n > 0:

time.sleep(n)

while recycle:

sleep_or_die() # don't take all cpu-resources

try:

# WORK: pulls a unit of work and executes it

# - raises NoWork if work queue is empty

# - raises LockException if too much lock

# contention (i.e. timeout waiting for lock)

commandq.run_command()

except commandq.NoWork as e:

# introduce randomness to prevent "harmonics"

sleeptime = random.randrange(1, 5)

sleep_or_die(sleeptime)

except commandq.LockException as e:

# too much lock contention... back off a little.

sleep_or_die(random.randrange(3, 10))

recycle -= 1

def start_workers(count, args):

"Start ``count`` number of worker processes."

procs = [multiprocessing.Process(target=worker, args=(args, os.getpid()))

for _i in range(count)]

_t = [t.start() for t in procs]

return procs

def main(daemon):

"Daemon entry point."

args = daemon.args

procs = start_workers(args.count, args) # start args.count workers

while 1:

# active_children() joins finished processes

procs = multiprocessing.active_children()

missing = args.count - len(procs)

if missing:

# if any of our workers died, start replacement processes

procs += start_workers(missing, args)

time.sleep(5)

if os.getpid() != daemon.getpid():

# a second copy has started, i.e. we should stop running

return

#[t.join() for t in procs] # subprocesses will die when they discover that we died.

class WorkerDaemon(daemon.Daemon):

"Worker daemon."

args = None

def run(self):

"main() does all the work."

def sigint_handler(signum, frame):

self.delpid()

signal.signal(signum, signal.SIG_DFL)

# re-throw signal (this time without catching it).

os.kill(os.getpid(), signum)

# make sure we don't leave sub-processes as zombies when someone

# kills the deamon process.

signal.signal(signal.SIGINT, sigint_handler)

signal.signal(signal.SIGTERM, sigint_handler)

main(self)

if __name__ == "__main__":

cpucount = multiprocessing.cpu_count()

parser = argparse.ArgumentParser(description='Command Queue worker.')

parser.add_argument(

'-n', dest='count', type=int, default=cpucount,

help='number of worker processes (defaults to number of processors).')

parser.add_argument('action', nargs='?',

help='stop|restart|status of the worker deamon.')

# when we move to 2.7 we can use the maxtaskperchild argument to

# multiprocessing.Pool

parser.add_argument(

' recycle', dest='recycle', type=int, default=400,

help='number of iterations before recycling the worker thread.')

_args = parser.parse_args()

daemon = WorkerDaemon(PID_FILE)

daemon.args = _args

if _args.action == 'status':

if daemon.status():

print "commandq worker is running."

else:

print "commandq worker is NOT running."

sys.exit(0)

elif _args.action == 'stop':

daemon.stop()

elif _args.action == 'restart':

daemon.restart()

else:

daemon.start()

sys.exit(0)

python runner.daemonrunner_在python中将参数传递给daemon runner相关推荐

  1. python pytest setupclass_python – Pytest – 如何将参数传递给setup_class?

    我有一些代码如下所示. 我运行时得到的args错误太少了. 我没有显式调用setup_class,因此不确定如何将任何参数传递给它. 我尝试用@classmethod修饰方法,但仍然看到相同的错误. ...

  2. adf开发_如何在ADF中将参数传递给ActionListener

    adf开发 在某些情况下,需要将值传递给ADF Button的ActionListener. 可以由actionListeners调用的方法只有一个ActionEvent类型的参数. 因此,我将解释如 ...

  3. 如何在ADF中将参数传递给ActionListener

    在某些情况下,需要将值传递给ADF Button的ActionListener. 可以由actionListeners调用的方法只有一个ActionEvent类型的参数. 因此,我将解释如何将参数传递 ...

  4. 将参数传递给Bash函数

    我试图搜索如何在Bash函数中传递参数,但是出现的是如何从命令行传递参数. 我想在我的脚本中传递参数. 我试过了: myBackupFunction("..", "... ...

  5. java变量传递给asp,我应该如何将多个参数传递给ASP.Net Web API GET?

    回答(10) 2 years ago 这个记录标记是什么意思?如果这仅用于记录目的,我将使用GET并禁用所有缓存,因为您要记录此资源的每个查询 . 如果记录标记有另一个目的,POST就是要走的路 . ...

  6. 如何将参数传递给setTimeout()回调?

    我有一些如下的JavaScript代码: function statechangedPostQuestion() {//alert("statechangedPostQuestion&quo ...

  7. 通过BeanShell获取UUID并将参数传递给Jmeter

    有些HTTPS请求报文的报文体中包含由客户端生成的UUID,在用Jmeter做接口自动化测试的时候,因为越过了客户端,直接向服务器端发送报文,所以,需要在Jmeter中通过beanshell获取UUI ...

  8. java+hadoop配置参数_将Hadoop参数传递给Java代码

    我有一个Uber jar执行一些级联ETL任务. jar的执行方式如下: hadoop jar munge-data.jar 我希望在作业启动时将参数传递给jar,例如 hadoop jar mung ...

  9. 如何将命令行参数传递给Node.js程序?

    我有一个用Node.js编写的Web服务器,我想使用一个特定的文件夹启动. 我不确定如何在JavaScript中访问参数. 我正在像这样运行节点: $ node server.js folder 这是 ...

最新文章

  1. JQuery 进入页面默认给已赋值的复选框打钩
  2. 内存泄漏分析 mat 使用 activity泄漏
  3. jquery 常用属性和函数(part I)
  4. IntelliJ IDEA的光芒会盖过Eclipse吗
  5. Python3-笔记-E-001-库-随机数random
  6. 2ex1逆向寒假生涯(24/100)
  7. redis(9)--数据库
  8. php下载文件与服务器有关吗,php 下载文件功能中下载后文件大小与服务器源文件大小不一致...
  9. 为什么长视频没有强算法推荐的产品
  10. python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
  11. java 骗局_Java有陷阱,用时需谨慎——慎用入参做返回值
  12. 金融数据分析(十)人均国内生产总值的增长率
  13. 【思考】windows补丁提权的疑问
  14. 使用Dockerfile制作ffmpeg镜像
  15. html实现个人自我介绍(精)
  16. 微信支付宝H5收款码扫码转账个人通道仿原生接口带备注可回调成功率9成以上
  17. Python 简单的人名对话
  18. 数据结构复习题(线性表)
  19. JavaScript实现蜘蛛纸牌
  20. SprinBoot+Jpa实现1024社区系统的最新职位推荐和最热职位推荐

热门文章

  1. 深入探索android热修复技术原理_打卡活动:技术书籍书单
  2. 计算机软考可以直接高级吗,计算机软考没有中级能考高级吗
  3. pandas dataframe 一行变多行 (query pv统计term pv)
  4. PHP面向对象的魔术方法
  5. leetcode Add Digits
  6. Deep Learning 10_深度学习UFLDL教程:Convolution and Pooling_exercise(斯坦福大学深度学习教程)...
  7. 直接在低版本IE6/7/8浏览器中使用HTML5的audio和video标签播放视频音频的办法
  8. [Erlang危机](4.4)命名管道
  9. asp.net 分页
  10. 新浪sae平台进行数据库的连接