Comment savoir quels processus ont la variable DISPLAY définie?

8

Parfois, je rencontre des problèmes d'affichage et surtout je veux savoir quels fichiers ou processus utilisent la variable d'environnement DISPLAY.

Alors, comment lister tous les processus sur lesquels DISPLAY est défini?

Maythux
la source

Réponses:

13

Je suis arrivé à cette commande après de nombreuses recherches et essais:

for file in /proc/[0-9]*; do grep -ao 'DISPLAY=[^[:cntrl:]]*' $file/environ 2>/dev/null && grep -ao '(.*)' $file/stat; done | sed 'N;s/\n/\t/'

Un échantillon de la sortie est:

DISPLAY=:0  (unity-files-dae)
DISPLAY=:0  (unity-music-dae)
DISPLAY=:0  (unity-lens-vide)
DISPLAY=:0  (zeitgeist-daemo)
DISPLAY=:0  (zeitgeist-fts)
DISPLAY=:0  (zeitgeist-datah)
DISPLAY=:0  (cat)
DISPLAY=:0  (unity-scope-vid)
DISPLAY=:0  (unity-musicstor)
DISPLAY=:0  (dconf-service)
DISPLAY=:0  (gdu-notificatio)
DISPLAY=:0  (telepathy-indic)
DISPLAY=:0  (mission-control)
DISPLAY=:0  (goa-daemon)
DISPLAY=:0  (VBoxXPCOMIPCD)
Maythux
la source
1
Belle solution. Pourriez-vous ajouter quelques explications sur ce qui se passe derrière la scène? De plus, la sortie est cropt, que puis-je faire pour obtenir les noms de processus complets?
Danatela
1
Cette commande recherche récursivement dans le répertoire / proc. grep pour le DISPLAYdans chaque fichier. Ces fichiers sont réellement dans les processus en cours d'exécution, donc chaque fichier contenant le mot DISPLAYsignifie que ce processus l'utilise. Vous ne pouvez pas obtenir le nom complet du processus car les noms dans la sortie sont les noms de fichiers fondés /proc, vous ne pouvez donc pas en savoir plus que ceux proposés.
Maythux
1
S'il vous plaît, modifiez votre réponse à la place et informez simplement l'utilisateur que vous avez mis à jour votre message.
Braiam
J'avais foiré la variable env DISPLAY et je voulais savoir quelles étaient les valeurs de DISPLAY avant de la changer, je ne connais aucune commande qui pourrait me parler de son histoire, donc en utilisant cette commande, j'ai trouvé quels processus antérieurs avaient utilisé quelle valeur d'affichage et mon problème a été résolu.
yaxe
1

Avec une petite modification du script Maythux, nous pouvons également obtenir le PID des processus en utilisant la variable DISPLAY.

for file in /proc/[0-9]*; do grep -ao 'DISPLAY=[^[:cntrl:]]*' $file/environ 2>/dev/null && grep -ao '[0-9]* (.*)' $file/stat; done | sed 'N;s/\n/\t/' |column -t |sort -n -k2

La sortie est:

DISPLAY=:0  590    (lxsession)
DISPLAY=:0  645    (unclutter)
DISPLAY=:0  705    (gvfsd)
DISPLAY=:0  710    (gvfsd-fuse)
DISPLAY=:0  727    (openbox)
DISPLAY=:0  729    (lxpolkit)
DISPLAY=:0  732    (lxpanel)
DISPLAY=:0  734    (pcmanfm)
DISPLAY=:0  772    (menu-cached)
DISPLAY=:0  781    (gvfs-udisks2-vo)
DISPLAY=:0  791    (gvfs-gphoto2-vo)
DISPLAY=:0  795    (gvfs-mtp-volume)
DISPLAY=:0  799    (gvfs-afc-volume)
DISPLAY=:0  804    (gvfs-goa-volume)
DISPLAY=:0  816    (gvfsd-trash)
DISPLAY=:0  21053  (npm)
DISPLAY=:0  21102  (sh)
DISPLAY=:0  21103  (sh)
DISPLAY=:0  21104  (node)
DISPLAY=:0  21110  (electron)
DISPLAY=:0  21112  (electron)
DISPLAY=:0  21149  (electron)
DISPLAY=:0  21154  (electron)
DISPLAY=:0  21180  (rec)
not2qubit
la source
0

C'est un script de ligne de commande assez astucieux! Je vais faire une copie de ce script au cas où je devrais le pirater pour trouver autre chose.

Idéalement, tous les processus actuels qui correspondent aux programmes que vous exécutez sur la machine locale, après la connexion, porteront la même variable d'affichage que votre première console pts ouverte (session pseudo-terminale).

Par exemple, lorsque vous ouvrez votre première session de terminal (gnome-terminal) et exécutez la commande who ou w, vous remarquerez une sortie comme celle-ci:

$ who

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0)

ou certaines personnes pourraient ressembler à ceci (mais ce n'est pas votre cas)

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0.0)

en utilisant le gestionnaire d'affichage léger si la variable DISPLAY est définie différemment pour l'exécution des shells après la connexion (par exemple: 0,0), alors la variable d'environnement pour DISPLAY produirait la même variable d'affichage que la variable d'affichage post-connexion des premiers points ouverts (: 0.0), mais la variable hôte, lors de la connexion, serait toujours (: 0).

En faisant écho à la variable DISPLAY ou en exécutant set piped to less comme indiqué ci-dessous:

:~$ echo $DISPLAY

ou

:~$ set | less

vous pouvez également vérifier la variable d'affichage actuelle de vos sessions et voir ce qu'elle est définie pour l'exécution des shells après la connexion. Donc, fondamentalement, la variable d'affichage des processus que vous exécutez aura la même variable d'affichage que vos premiers points ouverts, après la connexion.

La sortie du script que vous avez publiée suggère que vos premiers pts ouverts auront la même variable d'affichage que la connexion de votre gestionnaire d'affichage, dans ce cas: 0.

Maintenant, pour le deuxième exemple, la sortie ressemblerait à ceci:

DISPLAY=:0.0    (gvfs-udisks2-vo)
DISPLAY=:0.0    (zeitgeist-daemo)
DISPLAY=:0.0    (zeitgeist-fts)
DISPLAY=:0.0    (zeitgeist-datah)
DISPLAY=:0.0    (gvfs-mtp-volume)
DISPLAY=:0.0    (gvfs-gphoto2-vo)
DISPLAY=:0.0    (gvfs-afc-volume)
DISPLAY=:0.0    (geyes_applet2)
DISPLAY=:0.0    (indicator-apple)
DISPLAY=:0.0    (cat)
DISPLAY=:0.0    (python)
DISPLAY=:0.0    (gvfsd-trash)
DISPLAY=:0.0    (indicator-keybo)
DISPLAY=:0.0    (gvfsd-burn)
DISPLAY=:0.0    (cat) 
DISPLAY=:0.0    (cat)
DISPLAY=:0.0    (gnome-terminal)
DISPLAY=:0.0    (bash)
DISPLAY=:0.0    (bash)
DISPLAY=:0.0    (sed)

Aussi pour une lecture supplémentaire, vous pouvez consulter les pages de manuel de ptmx

$ man ptmx

Cela pourrait vous donner un aperçu de la relation maître-esclave des pseudo-terminaux.

J'espère que ça aide!

Aussi où avez-vous obtenu ce script?

oOpSgEo
la source