Python管理Windows服务小脚本


Posted in Python onMarch 12, 2018

本文实例为大家分享了Python管理Windows服务的具体代码,供大家参考,具体内容如下

#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
"""
Created by PyCharm.
File:        LinuxBashShellScriptForOps:ServiceControl.py
User:        Guodong
Create Date:    2016/10/14
Create Time:    17:57


Example of program with many options using docopt, control system service.
Usage:
 ServiceControl.py SERVICE_NAME SERVICE_ACTION
 ServiceControl.py SERVICE_ACTION SERVICE_NAME
 ServiceControl.py --version | -v
 ServiceControl.py --help | -h
Arguments:
 SERVICE_NAME service name
 SERVICE_ACTION service action in ["start", "stop", "restart", "status"]
Options:
 -h --help      show this help message and exit
 -v --version     show version and exit
"""
import sys
import codecs
import locale
import psutil
import win32serviceutil
import time
from collections import OrderedDict

from docopt import docopt

UNKNOWN = 0
STOPPED = 1
START_PENDING = 2
STOP_PENDING = 3
RUNNING = 4

status_code = {
  0: "UNKNOWN",
  1: "STOPPED",
  2: "START_PENDING",
  3: "STOP_PENDING",
  4: "RUNNING"
}


def get_system_encoding():
  """
  The encoding of the default system locale but falls back to the given
  fallback encoding if the encoding is unsupported by python or could
  not be determined. See tickets #10335 and #5846
  """
  try:
    encoding = locale.getdefaultlocale()[1] or 'ascii'
    codecs.lookup(encoding)
  except Exception:
    encoding = 'ascii'
  return encoding


DEFAULT_LOCALE_ENCODING = get_system_encoding()


# try:
#   result = result.decode(DEFAULT_LOCALE_ENCODING)
# except UnicodeDecodeError:
#   # UnicodeDecodeError - preventive treatment for non-latin Windows.
#   return ''

def is_iterable(source):
  if source is not None:
    try:
      iter(source)
    except TypeError:
      return False
    return True
  else:
    raise RuntimeError("argument cannot be None")


def status_service(service_name):
  try:
    result = win32serviceutil.QueryServiceStatus(service_name)[1]
    if result == START_PENDING:
      print "service %s is %s, please wait" % (service_name, status_code[result])
      time.sleep(2)
      return RUNNING
    elif result == STOP_PENDING:
      print "service %s is %s, please wait" % (service_name, status_code[result])
      time.sleep(2)
      return STOPPED
    else:
      return result if result is not None else 0
  except Exception as e:
    if e.message:
      raise RuntimeError(e.message)
    elif e.args:
      # print e.args
      args = list()
      for arg in e.args:
        if is_iterable(arg):
          args.append(unicode(eval(repr(arg)), 'gbk'))
        else:
          args.append(arg)
      print "Error:", args[-1], tuple(args)
      raise RuntimeError
    else:
      raise RuntimeError("Uncaught exception, maybe it is a 'Access Denied'") # will not reach here


def start_service(service_name):
  status = status_service(service_name)
  if status == STOPPED:
    pass
  elif status == RUNNING:
    print "service %s already started" % service_name
    return status

  try:
    print "starting %s" % service_name
    win32serviceutil.StartService(service_name)
  except Exception as e:
    if e.message:
      raise RuntimeError(e.message)
    elif e.args:
      # print e.args
      args = list()
      for arg in e.args:
        if is_iterable(arg):
          args.append(unicode(eval(repr(arg)), 'gbk'))
        else:
          args.append(arg)
      print "Error:", args[-1], tuple(args)
      raise RuntimeError
    else:
      raise RuntimeError("Uncaught exception, maybe it is a 'Access Denied'") # will not reach here
  return status_service(service_name)


def stop_service(service_name):
  status = status_service(service_name)
  if status == STOPPED:
    print "service %s already stopped" % service_name
    return status
  elif status == RUNNING:
    pass
  else:
    return status
  try:
    print "stopping %s" % service_name
    win32serviceutil.StopService(service_name)
  except Exception as e:
    if e.message:
      print e.message
    elif e.args:
      # print e.args
      args = list()
      for arg in e.args:
        if is_iterable(arg):
          args.append(unicode(eval(repr(arg)), 'gbk'))
        else:
          args.append(arg)
      print "Error:", args[-1], tuple(args)
      raise RuntimeError
    else:
      raise RuntimeError("Uncaught exception, maybe it is a 'Access Denied'") # will not reach here
  return status_service(service_name)


def restart_service(service_name):
  status = status_service(service_name)
  if status == START_PENDING or status == RUNNING:
    if status == START_PENDING:
      time.sleep(2)
    stop_service(service_name)
    status = status_service(service_name)
    if status == STOPPED or status == STOP_PENDING:
      if status == STOP_PENDING:
        time.sleep(2)
      return start_service(service_name)
  elif status == STOPPED or status == STOP_PENDING:
    print "service %s not running." % service_name
    return start_service(service_name)
  else:
    return status_service(service_name)


def do_service(service_name, service_action):
  # https://docs.python.org/2/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python
  # http://python.jobbole.com/82008/
  valid_action = ["start", "stop", "restart", "status"]
  maps = {
    "start": "start_service(service_name)",
    "stop": "stop_service(service_name)",
    "restart": "restart_service(service_name)",
    "status": "status_service(service_name)",
  }
  if service_name == "" or service_action == "":
    raise RuntimeError("service_name and service_action cannot be empty.")
  if service_action in valid_action:
    return eval(maps[service_action])
  else:
    raise RuntimeError("bad service_action '%s', valid action is %s" % (service_action, valid_action))


def list_service():
  service_dict = OrderedDict()
  for service in psutil.win_service_iter():
    service_dict[service.name()] = service.display_name()
  return service_dict


def is_valid_service_name(service_name):
  if service_name.lower() in [name.lower() for name, display_name in list_service().items()]:
    return True
  else:
    return False


if __name__ == '__main__':
  SERVICE_ACTION = ["start", "stop", "restart", "status"]
  arguments = docopt(__doc__, version='1.0.0rc2')

  if arguments['SERVICE_NAME'] != "" and arguments['SERVICE_ACTION'] != "":
    if arguments['SERVICE_ACTION'] in SERVICE_ACTION:
      pass
    elif arguments['SERVICE_NAME'] in SERVICE_ACTION:
      tmp = arguments['SERVICE_ACTION']
      arguments['SERVICE_ACTION'] = arguments['SERVICE_NAME']
      arguments['SERVICE_NAME'] = tmp
    else:
      print __doc__
      sys.exit(1)

    if is_valid_service_name(arguments['SERVICE_NAME']):
      pass
    else:
      raise RuntimeError("server '%s' not exist" % arguments['SERVICE_NAME'])

    return_code = do_service(arguments['SERVICE_NAME'], arguments['SERVICE_ACTION'])

    try:
      print status_code[return_code]
    except KeyError:
      print "return_code is %s." % return_code
  else:
    print __doc__
    sys.exit(1)

# TODO(Guodong Ding) run a command as administrator with administrative privilege, use 'runas' command?
state_command = "C:\WINDOWS\System32\sc.exe query MySQL56"
start_command = "C:\WINDOWS\System32\sc.exe start MySQL56"
stop_command = "C:\WINDOWS\System32\sc.exe stop MySQL56"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python随机生成一个6位的验证码代码分享
Mar 24 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
在Python的Django框架中加载模版的方法
Jul 16 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
Python3.5多进程原理与用法实例分析
Apr 05 Python
用python打印1~20的整数实例讲解
Jul 01 Python
django和vue实现数据交互的方法
Aug 21 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
python实现教务管理系统
Mar 12 #Python
python编写弹球游戏的实现代码
Mar 12 #Python
python学生管理系统代码实现
Apr 05 #Python
python图书管理系统
Apr 05 #Python
怎么使用pipenv管理你的python项目
Mar 12 #Python
python实现图书管理系统
Mar 12 #Python
python实现快速排序的示例(二分法思想)
Mar 12 #Python
You might like
php自动注册登录验证机制实现代码
2011/12/20 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
PHP getName()函数讲解
2019/02/03 PHP
PHP 8新特性简介
2020/08/18 PHP
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
Python获取服务器信息的最简单实现方法
2015/03/05 Python
Python随机生成数模块random使用实例
2015/04/13 Python
Python中的filter()函数的用法
2015/04/27 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
Python内置函数locals和globals对比
2020/04/28 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
2020/08/05 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
护士节演讲稿开场白
2014/08/25 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
排查MySQL生产环境索引没有效果
2022/04/11 MySQL