【问题标题】:Python code to check if service is running or not.?用于检查服务是否正在运行的 Python 代码。?
【发布时间】:2018-03-16 16:36:15
【问题描述】:

我正在使用 python2.7 来检查服务是否正在运行。我做了自己的服务并将其放在/etc/init.d 中。我有一个覆盆子,我正在使用它。

现在要正常检查服务状态,我们可以这样做:

service my_service status

但是如何从 python 代码中获取服务状态。

谢谢

【问题讨论】:

    标签: linux python-2.7


    【解决方案1】:

    我可能会迟到几年才能回答这个问题。但这是我找到的一个简单的解决方案

    import os  # I think it's better to use subprocess for this. but quick code for example
    
    status = os.system('systemctl is-active --quiet service-name')
    print(status)  # will return 0 for active else inactive.
    

    【讨论】:

      【解决方案2】:

      只需使用os.system()。然后你得到执行的返回码; 0 表示运行,768 停止

      >>> import os
      >>> stat = os.system('service sshd status')
      Redirecting to /bin/systemctl status  sshd.service
      ● sshd.service - OpenSSH server daemon
         Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
         Active: active (running) since Thu 2017-10-05 09:35:14 IDT; 29s ago
           Docs: man:sshd(8)
                 man:sshd_config(5)
        Process: 620 ExecStart=/usr/sbin/sshd $OPTIONS (code=exited, status=0/SUCCESS)
       Main PID: 634 (sshd)
         CGroup: /system.slice/sshd.service
                 └─634 /usr/sbin/sshd
      >>> stat
      0  <--  means service is running
      
      >>> os.system('service sshd stop')
      Redirecting to /bin/systemctl stop  sshd.service
      0  <-- command succeeded
      
      >>> os.system('service sshd status')
      Redirecting to /bin/systemctl status  sshd.service
      ● sshd.service - OpenSSH server daemon
         Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
         Active: inactive (dead) since Thu 2017-10-05 09:41:58 IDT; 10s ago
           Docs: man:sshd(8)
      ...
      768 <-- service not running
      

      返回代码是从执行返回的代码。来自 service 手册页:

      退出代码 服务调用初始化脚本并返回它返回的状态。

      所以这取决于执行的初始化脚本。您可以放心地说除 0 以外的任何返回码都表示服务未运行。

      您可以检查进程是否正在运行,使用:

      >>> os.system('ps aux | grep sshd | grep -v grep | wc -l')
      2
      >>> os.system('ps aux | grep sshd123 | grep -v grep | wc -l')
      0
      

      【讨论】:

      • 几乎在那里。您需要在代码中获取状态,而不仅仅是向用户显示。
      • 嗨,我照你说的做了。但我在输出中得到768
      • 768 表示服务未运行
      • @Vinny 在哪里可以找到所有服务返回代码?
      • @SAndrew 这取决于初始化脚本。你可以放心地假设0 表示正在运行,其他任何东西都没有运行。
      【解决方案3】:

      这里有一点离题的答案(对于 python3)。

      在 python3 中,您可以为此目的使用pystemd。它通过它的 dbus API 与 systemd 对话,所以它比仅仅执行 systemctl 并解析它的输出要好。

      附: 最好使用subprocess 模块而不是使用os.system()。

      【讨论】:

        【解决方案4】:

        使用子进程:

        import subprocess
        
        stat = subprocess.call(["systemctl", "is-active", "--quiet", "ssh"])
        if(stat == 0):  # if 0 (active), print "Active"
            print("Active")
        

        另外,我发现 this answer 很好地解释了为什么使用 subprocess 而不是 os.system

        【讨论】:

          【解决方案5】:

          您可以查看我的代码以供参考:

          #!/usr/bin/env python
          import os
          
          def isActive(daemon):
              command = "systemctl is-active " + daemon + " > tmp"
              os.system(command)
              with open('tmp') as tmp:
                  tmp = tmp.read()
                  if "active" in tmp:
                      os.remove('tmp')
                      return 1
              return 0
          
          
          sshd = "sshd"
          
          print(isActive(sshd))
          

          【讨论】:

          • 与现有答案相比,您提出的方法有什么好处?
          • 你好@Jeremy Caney:谢谢你提醒我。我只是提供另一种方法,如果有人在谷歌搜索解决方案,他们将有另一种选择。
          【解决方案6】:

          您需要做的第一件事是定义运行的含义:

          • systemd 为您提供 ok 状态
          • 进程正在运行/显示在 PS 中
          • 实际工作,即可以在本地主机上获取网页或 ssh 进入框

          然后写一些东西来执行你的测试或找到一个适合你的工具

          【讨论】:

            猜你喜欢
            • 2012-04-30
            • 1970-01-01
            • 2022-10-07
            • 2012-11-05
            • 1970-01-01
            • 2013-04-04
            • 2021-08-15
            • 2015-06-26
            • 2011-05-25
            相关资源
            最近更新 更多