Как вывести список процессов (сервисов) в Linux, как в случае с psutil? - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь напечатать текущие запущенные службы (процесс-демон?) В Linux с помощью psutil

В 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

Но когда я запускаю сервис --status-all, я получаю гораздо больший список, включая apache, sshd ....

Спасибо

1 Ответ

1 голос
/ 11 апреля 2019

Команда service в 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()
...