Linux pgrep active xsession

时间:2016-10-25 11:30:09

标签: bash session ubuntu process while-loop

我正在写一个代码:

  1. 将所有xsessions名称放在一个文件中。
  2. 虽然不是EOF,但为a指定了一行     变量,然后逐行传递给pgrep。
  3. 在终端输出pgrep。
  4. 有多种方法可以打印桌面环境,会话/窗口管理器。

    但我无法找到适合所有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

1 个答案:

答案 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在这种情况下找不到任何东西。