web-dev-qa-db-ja.com

loginctlセッションIDへのプロセスID

「小さな」問題が1つあります:)

コマンドを実行すると

loginctl list-session

セッション、uid、ユーザー、シートの列を持つ出力を取得します。したがって、ここにc6、c2、c4などのセッションがあります。

また、いくつかのIDを持つプロセスがあり、どのセッションで実行されているかを知りたいですか?

例えば

cat /proc/<pid>/sessionid

loginctlセッションとは完全に異なる4294967295のような数値を返します。

ここで私の主な質問はこれです:プロセスIDからloginctlセッションIDを取得するにはどうすればよいですか?.

はい、私はこれを実行できることを知っています

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

そしてユーザーを取得し、このユーザーをloginctlにマップしてセッションIDを取得します...しかし、これは正しい解決策ではないと思います。たとえば、loginctlにはUserAのインスタンスが1つしかありませんか? lightdm(xディスプレイマネージャー)のインスタンスがほとんどないことがわかり、どのセッションIDが正しいかわからないためです。

そして、はい、これをC++(c ++ 11)で実装するので、c ++の回答も受け入れます:)

ありがとうございました。

よろしく、golobitch

2
golobich

/ proc/pid/sessionidからloginctl show-session IDにIDを渡そうとしましたが、私の場合は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

また、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_login があります。しかし、残念ながら、私はその経験がありません。

2
Alexander