프로세스 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

/proc/pid/sessionid에서 ID를 다음으로 전달해 보셨나요? 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_로그인. 하지만 안타깝게도 저는 이에 대한 경험이 없습니다.

관련 정보