Identifiant de processus pour loginctl Identifiant de session


1

J'ai un "petit" problème :)

Si je lance la commande

loginctl list-session

Je vais obtenir une sortie qui aura des colonnes session, uid, utilisateur et siège. J'ai donc session ici en tant que c6, c2, c4, etc.

De plus, j'ai un processus avec un identifiant et je veux savoir dans quelle session est-il en cours d'exécution?

par exemple

cat /proc/<pid>/sessionid

retournera un nombre comme 4294967295 qui est complètement différent de la session loginctl.

Maintenant, ma question principale est la suivante: comment obtenir l'identifiant de session loginctl, à partir de l'identifiant de processus.

Oui, je sais que je peux l'exécuter

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

et obtenez l'utilisateur, puis mappez cet utilisateur sur loginctl et obtenez l'identifiant de session ... mais je ne pense pas que ce soit la bonne solution. Par exemple, n'y a-t-il qu'une seule instance de UserA dans loginctl? Parce que je peux voir qu'il y a peu d'instances de lightdm (x display manager) et que je ne suis pas sûr de savoir quel identifiant de session est correct.

Et oui, je vais implémenter cela en C ++ (c ++ 11), donc je vais aussi accepter les réponses c ++ :)

Je vous remercie.

Cordialement, golobitch


Que faire si un processus dans une session appelle setsid? Une session logind contiendrait alors deux sessions du noyau. Je crois que la session Iogind ressemble plus à un groupe de contrôle, je ne suis pas tout à fait sûr de cela en utilisant logind (ou disons, systemd en tant que gardien de la maison), cela maintiendra une relation stricte entre les sessions du noyau et les groupes de contrôle gérés par systemd. Je pense également que l’utilisation de dbus pour obtenir une liste pid d’une session de connexion peut être une meilleure idée.
Vendredi

Réponses:


1

avez-vous essayé de passer votre identifiant de / proc / pid / sessionid à loginctl show-session ID Mais dans mon cas, il affiche les numéros 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

Et je peux aussi le trouver par nom 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

Pour c ++, il existe une interface DBus dans systemd-logind ainsi que la bibliothèque C sd_login . Mais malheureusement, je n'ai aucune expérience avec ça.


Bonjour Alexandre et merci de votre réponse. Oui, j'ai essayé et passé mon identifiant de / proc / <pid> / sessionid à loginctl, show-session ID, mais sans succès. J'ai eu une erreur "Echec de la session. Aucune session '4294967295' n'est connue. Mais j'aime votre deuxième solution. Cependant, pouvez-vous me diriger un peu dans la bonne direction? Quels sont ces nombres dans / cgroup (que les premiers nombres (1 , 2, 3, ...))? Je vais peut-être utiliser ceci
golobich

Vous pouvez trouver des informations dans man cgroups en cherchant '/ proc / [pid] / cgroup' - man7.org/linux/man-pages/man7/cgroups.7.html
Alexander

Avez-vous vu cette ? Il serait plus facile pour vous de jouer avec dbus. freedesktop.org/wiki/Software/systemd/logind
Alexander

Oui Alexandre, tu as raison! Je dois avoir oublié cette méthode GetSessionByPID :) donc oui, si je dis, busctl org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager GetSessionByPID u <pid>alors je reçois chemin de l'objet pour la session appropriée. Je vous remercie. J'accepterai votre réponse, mais merci d'inclure également cette solution dans votre réponse. Et oui, j'utilise sd-bus en C ++
golobich

1
il y a aussi int sd_pid_get_session (pid_t pid, char ** session); fonction dans <systemd / sd-login.h>
Alexander
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.