python进程之间消息监控程序

外界调用向mgr进程发送消息,mgr根据不同消息启动或关闭相应进程(启动的进程,独占用,只启动一个);

若有进程程退出 则mgr向外界发出信号。


外界代码:


#!/usr/bin/python

#

# -*- coding:utf-8 -*-

#

#

import sys

import os

import subprocess

import signal

import time

import random


def sig_usr1(signum, frame):

  print("recive sinal from process(exited)")


signal.signal(signal.SIGUSR1, sig_usr1)


cmds= ['./mgr.py']

n =1

p = subprocess.Popen( cmds,stdin=subprocess.PIPE,stderr=subprocess.PIPE,close_fds=False)

while True:


    time.sleep(1)

    ret = p.poll()

    if ret is None:

      #print("main="+str(n))

      p.stdin.write(str(n)+"\n")

      p.stdin.flush()

      p.send_signal(signal.SIGUSR1)

      n = random.randint(1, 3)


print("main exit")


管理进程



#!/usr/bin/python

#

# -*- coding:utf-8 -*-

#


import sys

import os

import time

import signal

import subprocess


import json


data = {'num': 0, 'error': 0}


def getParentID():

  p=subprocess.Popen("ps -ef|grep tt.py|grep -v grep|awk '{print $2}'",stdout=subprocess.PIPE,shell=True)

  ret = int(p.stdout.readline())

  return ret


par_id = getParentID()

print(par_id)

exe_process = 0

isRuning = True



def sig_usr1(signum, frame):

  ret = sys.stdin.readline()

  data['num'] = int(ret)



signal.signal(signal.SIGUSR1, sig_usr1)



while isRuning:

  time.sleep(1)


  print("data['num'] ="+str(data['num']))

  if exe_process == 0: #for open

    if data['num'] == 1:

      exe_process=subprocess.Popen("./a.out",close_fds=False)

    elif data['num'] == 2:

      exe_process=subprocess.Popen("./b.out",close_fds=False)

    else:

      continue

  else: #if exe_process == 0: for close

    ret = exe_process.poll()

    if ret is None:

      if data['num'] == 3:

        exe_process.terminate()

        exe_process = 0

        os.kill(par_id,signal.SIGUSR1)


    else: #if ret is None self close

      exe_process = 0

      print("end"+str(par_id))

      os.kill(par_id,signal.SIGUSR1)



print "mgr process over "



python进程通讯注意问题

1)发送信号: os.kill(par_id,signal.SIGUSR1)  #注意要 import os

2)subprocess结合管道要注意,不用就不要打开,否则容易出错

    比如p = subprocess.Popen(cmd,stdin=subprocess.PIPE,close_fds=False)

    stdin 要用到。

3)用subprocess调用Popen时候,cmd若是python脚本,要确保能编译通过并运行。则调用,否则不好排除错误


转载于:https://my.oschina.net/u/2408048/blog/539840

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值