首页 > 解决方案 > 如何通过不需要 sudo 密码的 python 脚本停止和启动 systemd 服务

问题描述

以下脚本允许我检查 asystemd service是否处于活动状态,并停止或启动服务。执行.stop()or.start()时,如何在无需提供 sudo 密码的情况下直接停止和启动服务?一个有用的示例应用程序是停止和重新启动NetworkManager服务。

#!/bin/python3

import subprocess
import sys


class SystemdService(object):
    '''A systemd service object with methods to check it's activity, and to stop() and start() it.'''

    def __init__(self, service):
        self.service = service


    def is_active(self):
        """Return True if systemd service is running"""
        try:
            cmd = '/bin/systemctl status {}.service'.format(self.service)
            completed = subprocess.run( cmd, shell=True, check=True, stdout=subprocess.PIPE )
        except subprocess.CalledProcessError as err:
            print( 'ERROR:', err )
        else:
            for line in completed.stdout.decode('utf-8').splitlines():
                if 'Active:' in line:
                    if '(running)' in line:
                        print('True')
                        return True
            return False


    def stop(self):
        ''' Stop systemd service.'''
        try:
            cmd = '/bin/systemctl stop {}.service'.format(self.service)
            completed = subprocess.run( cmd, shell=True, check=True, stdout=subprocess.PIPE )
        except subprocess.CalledProcessError as err:
            print( 'ERROR:', err )


    def start(self):
        ''' Start systemd service.'''
        try:
            cmd = '/bin/systemctl start {}.service'.format(self.service)
            completed = subprocess.run( cmd, shell=True, check=True, stdout=subprocess.PIPE )
        except subprocess.CalledProcessError as err:
            print( 'ERROR:', err )


if __name__ == '__main__':
    monitor = SystemdService(sys.argv[1])
    monitor.is_active()

标签: pythonservice

解决方案


就像你的脚本一样为我工作。就像您的问题本身就有解决方案一样。在终端中,您可以使用以下命令示例启动、停止、重新启动服务:sudo systemctl restart "name of service".service。为了通过 python 脚本实现相同的功能,上面的命令示例变为: /bin/systemctl restart "name of service".service


推荐阅读