Python 如何在linux中列出守护进程(服务)进程,如psutil?

Python 如何在linux中列出守护进程(服务)进程,如psutil?,python,linux,psutil,Python,Linux,Psutil,我正在尝试使用psutil打印linux中当前正在运行的服务(守护进程?) 在windows中,使用psutil,我可以使用以下代码获取当前正在运行的服务: def log(self): win_sev = set() for sev in psutil.win_service_iter(): if sev.status() == psutil.STATUS_RUNNING: win_sev.add(sev.

我正在尝试使用psutil打印linux中当前正在运行的服务(守护进程?)

在windows中,使用psutil,我可以使用以下代码获取当前正在运行的服务:

def log(self):
        win_sev = set()
        for sev in psutil.win_service_iter():
            if sev.status() == psutil.STATUS_RUNNING:
                win_sev.add(sev.display_name())
        return win_sev
我想在linux中获得同样的效果,我尝试使用子流程模块和POPEN


 command = ["service", "--status-all"]  # the shell command
 p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)        
 result = p.communicate()[0]
 print result

然而,我想知道我是否可以使用psutil获得相同的结果,我尝试使用

psutil.pids()
但这只表明

python
init
bash
但当我运行服务时,我会得到一个更大的列表,包括apache、sshd

谢谢

WSL中的
服务
命令显示Windows服务。正如我们(在评论讨论中)确定的那样,您正在尝试列出Linux服务,并且仅将WSL用作测试平台,因此编写此答案是为了适用于大多数Linux发行版,而不是WSL


以下内容将在Linux发行版上使用systemd作为初始系统(这适用于大多数现代发行版,包括当前版本的Arch、NixOS、Fedora、RHEL、CentOS、Debian、Ubuntu等)。它将不会在WSL上工作,至少,不是您引用的版本,它似乎没有使用systemd作为其初始系统

#!/usr/bin/env python

import re
import psutil

def log_running_services():
    known_cgroups = set()
    for pid in psutil.pids():
        try:
            cgroups = open('/proc/%d/cgroup' % pid, 'r').read()
        except IOError:
            continue # may have exited since we read the listing, or may not have permissions
        systemd_name_match = re.search('^1:name=systemd:(/.+)$', cgroups, re.MULTILINE)
        if systemd_name_match is None:
            continue # not in a systemd-maintained cgroup
        systemd_name = systemd_name_match.group(1)
        if systemd_name in known_cgroups:
            continue # we already printed this one
        if not systemd_name.endswith('.service'):
            continue # this isn't actually a service
        known_cgroups.add(systemd_name)
        print(systemd_name)

if __name__ == '__main__':
    log_running_services()

试试这个:ps-eo'tty,pid,comm'| grep^?@user574362,
ps
psutil
检查内核的进程表,但是内核并不认为systemd服务与任何其他类型的进程不同……此外,无论您是在谈论Windows服务,还是systemd服务,或者其他与之仍然不同的东西。(在现代Linux发行版上列出服务的典型方式是
systemctl
,而不是
service
)…也就是说,你不是在问如何在Linux上做一些事情,你是在问如何在WSL上做一些事情,应该相应地编辑问题(或者在真正的Linux系统上测试)..您是想让该脚本显示来自WSL的Windows服务,还是显示Linux服务?如果是Linux服务,“服务”的整个概念取决于发行版使用的init系统,因此问题需要针对特定的init系统——无论是systemd、runit、upstart还是daemontools,等等。