python基于子进程和临时文件的命令执行

该博客介绍了如何在Python中通过子进程和临时文件来执行iostat命令,收集磁盘I/O统计信息。利用multiprocessing模块创建子进程,通过subprocess.Popen将iostat命令的输出重定向到临时文件,然后解析并存储结果,最后使用JsonTools将数据保存为JSON文件。
# coding: utf-8

import os
import re
import sys
import time
import multiprocessing
import tempfile
from multiprocessing import Process
import subprocess
from .Tools import JsonTools

class IOStatCollector(object):

    def __init__(self):
        self.cmd = 'iostat -kxt 1'
        # 子进程
        self.proc = Process(target=self.task())
        self.sub_proc = None
        self.out_temp = tempfile.TemporaryFile(mode='w+')
        # cmd执行的结果
        self.rt_list = None

    # def exec_cmd(self):
    #     # 要执行的命令
    #     cmd = 'iostat -kxt 1'
    #     # 启动子进程执行命令
    #     self.sub_proc = os.popen(cmd)
    #     # 读取命令执行结果
    #     while 1:
    #         line = self.sub_proc.readline()
    #         print(line)
    #         if line.startswith('sda'):
    #             self.records.append(line)

    def exec_cmd(self, cmd):
        try:
            # 获取临时文件的文件号
            fileno = self.out_temp.fileno()

            # 执行外部shell命令, 输出结果存入临时文件中
            self.sub_proc = subprocess.Popen(cmd, shell=True, stdout=fileno, stderr=fileno)

        except Exception as e:
            print(e)



    # 获取cmd的执行结果
    def get_result(self):
        # 从临时文件读出shell命令的输出结果
        self.out_temp.seek(0)
        rt = self.out_temp.read()

        # 以换行符拆分数据,并去掉换行符号存入列表
        self.rt_list = rt.strip().split('\n')
        for line in self.rt_list:
            if not line.startswith('sda'):
                self.rt_list.remove(line)
        # 关闭并删除临时文件
        if self.out_temp:
            self.out_temp.close()


    # 定义task
    def task(self):
        self.exec_cmd(self.cmd)

    # 开始任务,启动子进程
    def start(self):
        self.proc.start()

    # 停止进程
    def stop(self):
        # 停止子进程
        self.sub_proc.terminate()
        self.proc.terminate()
        # 结果存进文件
        self.get_result()
        # TODO
        JsonTools.saveAsJson('iostat.json', self.rt_list)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值