进程 id 到 loginctl 会话 id

进程 id 到 loginctl 会话 id

我遇到一个“小”问题:)

如果我运行命令

loginctl list-session

我将得到包含会话、uid、用户和席位列的输出。所以我在这里有 c6、c2、c4 等会话。

另外,我有一个带有某个 id 的进程,我想知道它在哪个会话中运行?

例如

cat /proc/<pid>/sessionid

将返回一些数字,例如 4294967295,这与 loginctl 会话完全不同。

现在我的主要问题是:如何从进程 id 中获取 loginctl 会话 id。

是的,我知道我可以运行这个

ps aux | grep -i <pid> | awk '{print $1}'

并获取用户,然后将此用户映射到 loginctl 并获取会话 id...但我认为这不是正确的解决方案。例如,loginctl中UserA只有一个实例吗?因为我可以看到 lightdm(x 显示管理器)的实例很少,并且我无法确定哪个会话 id 是正确的。

是的,我将用 C++ (c++11) 实现这个,所以我也接受 C++ 答案:)

谢谢。

问候,戈洛比特

答案1

您是否尝试将您的 ID 从 /proc/pid/sessionid 传递到loginctl show-session ID 但就我而言,它显示了相同的数字。

someuser@somemachine-test ~ $ cat /proc/self/sessionid
9293

someuser@somemachine-test ~ $ loginctl list-sessions
   SESSION        UID USER             SEAT
      9293      10002 someuser

1 sessions listed.
someuser@somemachine-test ~ $ loginctl show-session 9293
Id=9293
User=10002
Name=someuser
Timestamp=Tue 2018-09-18 13:24:08 CEST
TimestampMonotonic=3614939245544
VTNr=0
Remote=yes
RemoteHost=172.21.98.41
Service=sshd
Scope=session-9293.scope
Leader=8290
Audit=9293
Type=tty
Class=user
Active=yes
State=active
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
LockedHint=no

我还可以通过 cgourp 的名称找到它:

someuser@somemachine-test ~ $ cat /proc/self/cgroup
11:pids:/
10:memory:/user.slice
9:freezer:/
8:hugetlb:/
7:devices:/
6:cpuacct,cpu:/user.slice
5:blkio:/
4:perf_event:/
3:cpuset:/
2:net_prio,net_cls:/
1:name=systemd:/user.slice/user-10002.slice/session-9293.scope

对于 c++ 有systemd-logind 中的 DBus 接口还有 C 库sd_登录。但不幸的是我对此没有任何经验。

相关内容