Id do processo para id de sessão loginctl

1

Estou com um problema "pequeno":)

Se eu executar o comando

loginctl list-session

Eu receberei uma saída que terá colunas session, uid, user e seat. Então eu tenho sessão aqui como c6, c2, c4, etc.

Além disso, tenho um processo com algum id e quero saber em qual sessão ele está sendo executado?

por exemplo

cat /proc/<pid>/sessionid

retornará algum número como 4294967295, que é completamente diferente daquela sessão loginctl.

Agora, a minha principal questão aqui é esta: Como posso obter o id de sessão do loginctl, a partir do id do processo.

Sim, sei que posso executar isso

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

e obter usuário e, em seguida, mapear este usuário para loginctl e obter id de sessão ... mas não acho que essa seja a solução correta. Por exemplo, há apenas uma instância do UserA no loginctl? Porque eu posso ver que existem poucas instâncias de lightdm (x gerenciador de exibição) e não posso ter certeza de qual id de sessão está correto.

E sim, eu vou implementar isso em C ++ (c ++ 11), então eu também aceito respostas c ++:)

Obrigado.

Atenciosamente, golobitch

    
por golobich 18.09.2018 / 11:48

1 resposta

1

você tentou passar seu ID de / proc / pid / sessionid para loginctl show-session ID Mas no meu caso, mostra os números sam.

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

E eu também posso encontrá-lo pelo nome de 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

Para o c ++, existe Interface DBus no systemd-logind e também na biblioteca C sd_login . Mas infelizmente não tenho experiência com isso.

    
por 18.09.2018 / 13:34