python怎么获取windows服务的PID

代码背景

部署在windows上的测试服务器服务会由于某种原因(当然,现在是解决了)出现服务挂了的情况。由于有一定周期性,所以就写了脚本进行处理。本节主要讲的是pid的获取与取到pid后处理方式(windows)。
本次需要额外安装的库有两个:psutil,subprocess
subprocess很简单,可以用pip安装。psutil安装需要VC2010++库,但是据我实测,VC2010++库就算安装上了也会出现安装不上的情况。所以分享一个psutil包。此包有版本限制,之前写这程序的时候我的python版本是:3.4.3 。
链接:http://pan.baidu.com/s/1dE93riT 密码:y8cd

代码

下面上代码,为了便于理解,特意在代码后添加了注释。希望有所帮助。

import psutil
import re
import sys
import os
import time
import logging
import subprocess

logging.basicConfig(level=logging.INFO,  
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                    datefmt='%a, %d %b %Y %H:%M:%S',  
                    filename='pid.log',  
                    filemode='a')   #日志配置
logging.debug('----------------------------------------------init----------------')

PROCESS_RE = re.compile("pid=\d{1,4},\sname='\S{1,20}'") #采用正则,获取数据 pid=x/xx/xxx/xxxx, name=[1~20个字符,不是空格]

pidNotHandle = list(psutil.process_iter()) #获取当前计算机的pid
pid = []
pidName = []
for each in pidNotHandle:
    a = str(each) #each 是 class类型,可用type(each)查看类型
    print(a) #数据样式为:psutil.Process(pid=0, name='System Idle Process')
    pid.append(a[15:-1]) # 只取括号内部分;pid=0, name='System Idle Process'
for each in pid:    
    print(each)
    b = each.find("name") #获取name的位置;name='System Idle Process'
    c = each[b+6:-1] #获取name值;System Idle Process
    #print(c)
    if c == "OrgTomcat.exe": #目标服务名称为:OrgTomcat.exe
        d = each.find("pid") #获取对象的位置;pid=0, name='System Idle Process'
        e = each[d+4:b-2] #获取pid的值:0
        print("PID:",e)  #打印目标服务的PID
        unread = os.popen('tasklist | findstr '+ e) #查看占用该PID的有哪些服务
        logging.info(unread.read())
        print('read1:',unread.read())
        unread2 = os.popen('taskkill /pid %s /f' % e) #杀掉该PID的服务
        read2 = unread2.read()
        print('read2:',read2)
        time.sleep(10)
        unread3 = os.popen('net start "Apache Tomcat 7.0 OrgTomcat"') #重新启动服务名称为:‘Apache Tomcat 7.0 OrgTomcat’服务
        print('read3:',unread3.read())
        logging.info(unread3.read())
        break


#for i in range(len(pid)):
    #pid[pid[i].find(name)+6:]
    #print()
#type(pid[-1])
#pid[-1].find('name')
#b = pid[-1]
#b.find('name')

附件

程序运行结果图:
python怎么获取windows服务的PID_第1张图片
cmd窗口命令执行图:
python怎么获取windows服务的PID_第2张图片

你可能感兴趣的:(python学习)