文档章节

Python 启动,停止服务脚本

蘑菇头老大
 蘑菇头老大
发布于 2013/10/11 10:40
字数 432
阅读 3.5K
收藏 15
python xx.py start 启动服务
python xx.py stop 停止服务

python xx.py check 检查服务是否运行

原理:启动后创建一个 pid文件,里面记住程序的进程号(PID)。再次启动检查这个pid是否在运行。

PS:翻监控宝的采集插件看到的,觉得写脚本挺有用的。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import platform,os
import time
import subprocess
import sys
import ctypes


def get_sysinfo():
    sys = platform.system()
    return os.getpid(),sys
    
def get_path():
    p=os.path.split(os.path.realpath(__file__))  # ('D:\\workspace\\python\\src\\mysql', 'dao.py')
    p=os.path.split(p[0])
    if not p:
        os.mkdir(p)
    return p[0]


def get_pid_path():
    return get_path() +'/tmp/yqs.pid'


def check_pid(pid = 0,osname=''):
    if pid is None or pid == 0:
        return False
    wincmd = 'tasklist /FI "PID eq %s"  /FI "IMAGENAME eq python.exe "' % str(pid)
    lincmd = 'ps ax |grep %s |grep python' % str(pid)
    cmd,size = (wincmd,150) if osname=='Windows' else (lincmd,20)
    returnstr=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
    data = returnstr.stdout.read()
    return len(data) > size
    
def read_pid():
    if os.path.exists(get_pid_path()):
        try:
            with open(get_pid_path(),'r') as f:
                strpid = f.readline().strip()
                return int(strpid)
        except Exception :
            return None
    return None


def rm_pid():
    if os.path.exists(get_pid_path()):
        os.remove(get_pid_path())
        
def kill(pid):
    """kill function for Win32"""
    kernel32 = ctypes.windll.kernel32
    handle = kernel32.OpenProcess(1, 0, pid)
    return (0 != kernel32.TerminateProcess(handle, 0))
        
def check_run():
    pid,osname = get_sysinfo()
    if not os.path.exists(get_pid_path()):
        with open(get_pid_path(),'w') as f: f.write(str(pid))
        return False
    
    ''' 开始检查 '''
    rs = check_pid(read_pid(),osname)
    if not rs : 
        with open(get_pid_path(),'w') as f: f.write(str(pid))
    return rs
        
class Control :
    def start(self):
        if check_run():
            print 'pro has run'
        else :
            print 'pro start...'
            time.sleep(1000)
    
    def stop(self):
        filePid = read_pid()
        if filePid is not None and filePid > 0:
            print 'pro has kill %s' % filePid
            kill(filePid)
            rm_pid()
        else :
            print 'Process has closed'
            
    def check(self):
        filePid = read_pid()
        if not filePid or not check_run() :
            message = "Process has closed\n"
            sys.stderr.write(message)
        else :
            message = "The process has been run, the process id:%d\n"
            sys.stderr.write(message % filePid)
                
    def helpInfo(self):
        print "usage: start|stop|check|help"
                            
if __name__ == "__main__":
    contr=Control()
    if len(sys.argv) == 2:
        param = sys.argv[1]
        if 'start' == param:
            contr.start()
        elif 'stop' == param:
            contr.stop()
        elif 'check' == param:
            contr.check()
        elif 'help' == param:
            contr.helpInfo() 
        else:
            print r"not yes cmd"
            sys.exit(2)
    else:
        print "usage: %s start|stop|check|help" % sys.argv[0]                

© 著作权归作者所有

上一篇: Curator lock
蘑菇头老大
粉丝 2
博文 20
码字总数 7628
作品 0
杭州
私信 提问
加载中

评论(1)

h
haiyan
回头我试试
使用Coverage分析Python web项目的代码覆盖率

关于Coverage Coverage是Python代码覆盖率分析工具,有关它的介绍和安装方法请见: Python代码覆盖率分析工具Coverage 用Python启动的web服务可以方便地使用Coverage分析其覆盖率,假设一个w...

yasmine
2019/09/29
0
0
一个启动,停止,重启微服务的shell脚本例子

一个启动,停止,重启微服务的shell脚本例子 一号门-程序员的工作,程序员的生活(java,python,delphi实战)2018-08-071559 阅读 脚本shell停止服务重启例子启动...

一号门-程序员的工作,程序员的生活(java,python,delphi实战)
2018/08/07
0
0
Shell脚本批量启停Docker

目录 启动docker 停止docker Python调用脚本     最近日常测试中经常需要手动启动或停止docker,于是决定写一个Shell脚本来代替人工操作,另外该脚本,也可以通过Python脚本实行远程调用,...

Surpassme
2019/11/08
0
0
svn版本备份-- python 脚本

svn版本备份 备份机制 1, 每10分钟检查一次svn(时间可以在配置文件中配置)。 2,检查到有更新时备份最新版本,记录更新内容。 3,删除30天之前的备份(天数可以配置)。 配置文件 # vi ../...

磁针石
2014/04/09
959
0
python定时器用法 + 获取脚本所在绝对路径 + 定义日志格式 + shell将脚本直接启动到后

python定时器用法 + 获取脚本所在绝对路径 + 定义日志格式 的测试代码 如果用python写好一个有定时器的脚本后,如果脚本里还读了配置文件,那么配置文件路径如果写死的话,有一天要换了存放目...

燃烧的大脑
2018/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring ElasticsearchTemplate 经纬度按距离排序

es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度) @Document(indexName = "v_intelligent_store")@Datapublic class IntelligentStore imp......

osc_s752w055
17分钟前
37
0
Spring ElasticsearchTemplate 经纬度按距离排序

es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度) @Document(indexName = "v_intelligent_store")@Datapublic class IntelligentStore imp......

osc_l330x9u1
19分钟前
47
0
Spring ElasticsearchTemplate 经纬度按距离排序

es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度) @Document(indexName = "v_intelligent_store")@Datapublic class IntelligentStore imp......

osc_kd8rd7b3
20分钟前
34
0
Android Studio开发获取本地时间

实现本地聊天记录功能,用到获取本地时间的函数,感觉比较实用,分享给大家! 1、在相应moudle的java文件夹下建立自己的util文件夹如·: 2、建立DateUtil类 package com.example.junior.uti...

osc_k6latecv
21分钟前
47
0
给 Windows 的终端配置代理

初衷 由于项目开发使用go,所以经常要用到go get,但是吧,terminal下根本没办法下载啊,经常下载三个小时包,写代码一个小时 本质上go get就是在使用git clone吧 迫于无奈,只好找个方式可以在...

osc_ocl8o73l
22分钟前
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部