如何打印进程数前10名的用户?

发布于 2024-09-27 12:49:50 字数 88 浏览 3 评论 0原文

如何按 Linux 发行版上运行的进程数打印前 10 位用户?我已经设法使用 shell 脚本来完成此操作,但现在我对如何使用 Python 来完成此操作感兴趣。

How could I print the top 10 users on a linux distribution by the number of processes they have running? I have managed to do this using a shell script, but now I'm interested at how I can do this using Python.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

琴流音 2024-10-04 12:49:50

解析 ps aux 的输出不是很愉快,而且可能很棘手,因为不能保证所有 Linux 系统上的格式都相同。

安装第三方工具,例如 psutilPSI 应该让事情变得简单和便携。

如果您正在寻找仅适用于 Linux 的解决方案而不安装第三方模块,那么以下内容可能会有所帮助:

在现代 Linux 系统上,所有进程都按其 pid 列在 /procs 目录中。目录的所有者就是进程的所有者。

import os
import stat
import pwd
import collections
import operator

os.chdir('/proc')
dirnames=(dirname for dirname in os.listdir('.') if dirname.isdigit())
statinfos=(os.stat(dirname) for dirname in dirnames)
uids=(statinfo[stat.ST_UID] for statinfo in statinfos)
names=(pwd.getpwuid(uid).pw_name for uid in uids)
counter=collections.defaultdict(int)
for name in names:
    counter[name]+=1
count=counter.items()
count.sort(key=operator.itemgetter(1),reverse=True)
print('\n'.join(map(str,count[:10])))

产量

('root', 130)
('unutbu', 55)
('www-data', 7)
('avahi', 2)
('haldaemon', 2)
('daemon', 1)
('messagebus', 1)
('syslog', 1)
('Debian-exim', 1)
('mysql', 1)

Parsing the output of ps aux is not very pleasant, and can be tricky because the format is not guaranteed to be the same on all Linux systems.

Installing a third-party tool like psutil or PSI should make things easy and portable.

If you are looking for a Linux-only solution without installing a third-party module, then the following might help:

On modern Linux systems, all processes are listed in the /procs directory by their pid. The owner of the directory is the owner of the process.

import os
import stat
import pwd
import collections
import operator

os.chdir('/proc')
dirnames=(dirname for dirname in os.listdir('.') if dirname.isdigit())
statinfos=(os.stat(dirname) for dirname in dirnames)
uids=(statinfo[stat.ST_UID] for statinfo in statinfos)
names=(pwd.getpwuid(uid).pw_name for uid in uids)
counter=collections.defaultdict(int)
for name in names:
    counter[name]+=1
count=counter.items()
count.sort(key=operator.itemgetter(1),reverse=True)
print('\n'.join(map(str,count[:10])))

yields

('root', 130)
('unutbu', 55)
('www-data', 7)
('avahi', 2)
('haldaemon', 2)
('daemon', 1)
('messagebus', 1)
('syslog', 1)
('Debian-exim', 1)
('mysql', 1)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文