Process id to loginctl session id
have you tried to pass your ID from /proc/pid/sessionid to loginctl show-session ID
But in my case it shows the sam numbers.
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
And I can also find it by name of 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
For c++ there is DBus Interface in systemd-logind and also C library sd_login. But unfortunately I don't have any experience with that.
Related videos on Youtube
golobitch
B.S. in Computer and Information science You are also very welcome to check out my Medium profile: https://medium.com/@tadej.golobic
Updated on September 18, 2022Comments
-
golobitch over 1 year
I am having one "small" problem :)
If I run command
loginctl list-session
I will get output that will have columns session, uid, user and seat. So I have session here as c6, c2, c4, etc.
Also, I have a process with some id, and I want to know in what session is it running?
for example
cat /proc/<pid>/sessionid
will return some number like 4294967295 which is completely different that loginctl session.
Now my main question here is this: How can I get loginctl session id, from process id.
Yes, I know that I can run this
ps aux | grep -i <pid> | awk '{print $1}'
and get user, and then map this user to loginctl and get session id... but I don't think this is the right solution. For example, is there only one instance of UserA in loginctl? Because I can see that there are few instances of lightdm (x display manager) and I cannot be sure which session id is correct.
And yes, I will implement this in C++ (c++11), so I will also accept c++ answers :)
Thank you.
Regards, golobitch
-
炸鱼薯条德里克 over 5 yearsWhat if some process in a logind session calls
setsid
? Then a logind session would contain two kernel sessions. I believe Iogind session is more like a cgroup, I am not quite sure about that when using logind (or say, systemd as your house keeper), it will maintain a strict relationship between kernel sessions and systemd managed cgroups. I also think using dbus to get a pid list of a logind session might be a better idea.
-
-
golobitch over 5 yearsHi Alexander and thank you for you answer. Yes, I tried and passed my id from /proc/<pid>/sessionid to loginctl show-session ID, but no success. I got error "Failed to get session. No session '4294967295' known. But I like your second solution. However, can you point me a little bit in the right direction? What are those numbers in /cgroup (that first numbers (1, 2, 3,...))? I will maybe use this
-
Alexander over 5 yearsYou can find info in man cgroups by search for '/proc/[pid]/cgroup' - man7.org/linux/man-pages/man7/cgroups.7.html
-
Alexander over 5 yearsHave you seen this ? It would be easier for you to play with dbus. freedesktop.org/wiki/Software/systemd/logind
-
golobitch over 5 yearsYes Alexander, you are right! I must have overlooked that GetSessionByPID method :) so yes, if I say
busctl org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager GetSessionByPID u <pid>
then I get object path for proper session. Thank you. I will accept your answer, but please incldue this dbus solution in your answer as well. And yes, I am using sd-bus in C++