我在写一段代码:
有几种方法可以打印桌面环境,会话/窗口管理器。
但是,我找不到一个适用于所有xsession的工作(/usr/share/xsession)。
经过多次尝试,它仍然不起作用。循环有一个问题。
ls /usr/share/xsessions/>all_xsessions;while [ "$var" != "" ]; do let x=x+1; var=$(sed "${x}q;d" all_xsessions); pgrep -lu $(whoami) $var; done
发布于 2016-10-25 17:50:58
不幸的是,没有真正的标准方式或普遍的环境变量。大多数信息可以从printenv获得,但是变量名称有很大差异。
例如,在具有xfce的are中,会话直接从windows管理器运行,您可以从变量获得$SESSION_MANAGER PID。
但是在ubuntu,这是现在最流行的桌面发行版,您的x会话实际上是一个新的会话,它启动所有需要的东西。变量是$UPSTART_SESSION。
在xubuntu中,您有$SESSION_MANAGER和$UPSTART_SESSION变量。
还有$DESKTOP_SESSION,它几乎无处不在,包含了一些桌面环境的名字,比如xfce,ubuntu的xubuntu。
因此,这可能因发行版而异,但在大多数情况下,该脚本将适用于您。
#!/bin/bash
[[ -n $SESSION_MANAGER ]] && pid="${SESSION_MANAGER##*/}"
[[ -n $UPSTART_SESSION ]] && pid="${UPSTART_SESSION##*/}"
process_name=$(cat /proc/$pid/cmdline)
pretty_name=$DESKTOP_SESSION
echo "$process_name : $pid : $pretty_name"产出将是这样的:
# Arch with xfce
xfce4-session : 3021 : xfce
# Ubuntu
/sbin/upstart--user : 3153 : ubuntu
# Xubuntu
init--user : 2343 : xubuntu编辑:在某些情况下,您的方法可以工作,但大多数情况下它将失败。就因为现在我在ubuntu有:
$ ls -1 /usr/share/xsessions/
openbox.desktop
ubuntu.desktop联合中的x会话启动过程如下所示:
root 964 0.0 0.0 276680 6032 ? SLsl 00:16 0:00 /usr/sbin/lightdm
root 997 3.8 0.9 255676 74708 tty7 Ss+ 00:16 0:15 \_ /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
root 1196 0.0 0.0 230304 6420 ? Sl 00:16 0:00 \_ lightdm --session-child 12 19
user 1442 0.0 0.0 53756 4924 ? Ss 00:16 0:00 \_ /sbin/upstart --user
user 1734 0.0 0.0 39992 280 ? S 00:16 0:00 \_ upstart-udev-bridge --daemon --user
user 1737 0.2 0.0 43932 4332 ? Ss 00:16 0:00 \_ dbus-daemon --fork --session --address=unix:abstract=/tmp/dbus-wkfpguwfxw
user 1749 0.0 0.1 93416 8756 ? Ss 00:16 0:00 \_ /usr/lib/x86_64-linux-gnu/hud/window-stack-bridge因此,/usr/share/xsessions/中的会话名与实际进程cmdline之间没有相关性。所以pgrep在那种情况下什么都找不到。
https://stackoverflow.com/questions/40238789
复制相似问题