我正在构建一个玩具系统监视器,我为其解析了来自的多个文件/proc
。除其他值外,我还解析了来自的uid
每个进程的/proc/$pid/status
。后来,我将进程的uid映射到我从中解析的用户名/etc/passwd
。但在极少数情况下,我的程序会崩溃,因为它找不到用户名。我是否也需要解析其他文件才能获得完整的uid->用户名映射?
答案1
Linux 支持模块化帐户数据库。除了“文件”数据库 (/etc/passwd) 之外,用户帐户还可以存储在 SSSD、BDB、网络数据库 (LDAP、YP、NIS、Hesiod、Active Directory、SQL) 中,甚至可以由数据库模块本身动态生成 (systemd DynamicUsers)。
为了实现这个目标,你应该绝不直接解析 /etc/passwd 和其他文件(除非您专门制作本地用户管理工具)。
您应该使用 libc 提供的函数,例如获取 pwuid()或者获取 grgid()查找用户名和 UID,并且您应该从 shellscripts 中使用getent
或id
CLI 工具执行查找。
一般情况下,如果映射失败,您也不应该崩溃,因为帐户可能已被删除,或者进程属于具有自己的 UID 范围的容器。发生这种情况时,只需显示 UID 即可。