Process id to loginctl session id

5,307

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.

Share:
5,307

Related videos on Youtube

golobitch
Author by

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, 2022

Comments

  • golobitch
    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 years
      What 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
    golobitch over 5 years
    Hi 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
    Alexander over 5 years
    You can find info in man cgroups by search for '/proc/[pid]/cgroup' - man7.org/linux/man-pages/man7/cgroups.7.html
  • Alexander
    Alexander over 5 years
    Have you seen this ? It would be easier for you to play with dbus. freedesktop.org/wiki/Software/systemd/logind
  • golobitch
    golobitch over 5 years
    Yes 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++