bash - Linux pgrep 事件 xsession

标签 bash session ubuntu process while-loop

我正在编写一个代码:

  • 将所有 xsessions 名称放在一个文件中。
  • 虽然不是 EOF ,但将一行分配给 a
    变量,然后将其逐行传递给 pgrep。
  • 在终端中输出 pgrep。

  • 有几种打印桌面环境、 session /窗口管理器的方法。

    但是我找不到一个适用于所有 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

    最佳答案

    不幸的是,没有真正的标准方法或通用环境变量。
    大部分信息可以从printenv获得但是变量名有很大不同。

    例如,在带有 xfce 的 arch-linux 中, session 直接从 windows-manager 运行,您可以获得 PID 来自 $SESSION_MANAGER多变的。

    但是在 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/ 中的 session 名称之间没有相关性和真实的过程cmdline .所以 pgrep 在那种情况下不会找到任何东西。

    关于bash - Linux pgrep 事件 xsession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40238789/

    相关文章:

    bash - 在 slurm 处理的 bash 脚本中评论

    bash - 如何从 git bash 使用命令行 Visual Studio 编译器?

    session - 模拟 Cassandra session 对象

    php - $_SERVER ['PHP_SELF' 的问题]

    ubuntu - Devstack 安装失败 : stack. sh failed 退出时出错

    python - 错误 : (gcloud. app.deploy) 错误响应:[9] Cloud build c90ad64e-2c2f-4ad0-a250-160de6f315df 状态:FAILURE

    mysql - 将查询存储在bash中的数组中

    linux - 回显到没有换行的文件

    php - 如何让用户保持登录状态,直到他们注销或关闭浏览器

    node.js - Ubuntu + Ember 不工作