我正在写一个代码:
有多种方法可以打印桌面环境,会话/窗口管理器。
但我无法找到适合所有xsession的工作(/ usr / share / xsessions)。
经过多次尝试,它仍然无法运作。 循环存在问题。
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
答案 0 :(得分:0)
不幸的是,没有真正的标准方法或通用的环境变量。
大多数信息都可以从printenv
获得,但变量名称差异很大。
例如,在带有xfce的arch-linux中,会话直接从windows-manager运行,您可以从$SESSION_MANAGER
变量获得 PID 。
但是在ubuntu中,这是现在最流行的桌面发行版,你的x-session实际上是upstart-session,它启动了所需的一切。变量是$UPSTART_SESSION
。
在xubuntu中你有两个$ SESSION_MANAGER和$ UPSTART_SESSION变量。
还有$DESKTOP_SESSION
,它几乎存在于任何地方,并且包含一些漂亮的桌面环境名称,如xfce,xubuntu的ubuntu。
因此,这可能与发行版和发行版不同,但在大多数情况下,该脚本适合您。
#!/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
Unity中的x-session启动过程如下所示:
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在这种情况下找不到任何东西。