Определите DBUS_SESSION_BUS_ADDRESS снаружи X сессий

Необходимо сократить объемы производства столбцов ps к минимуму, т.е. запросу только имя пользователя здесь - это упрощает последующую обработку.

Например:

$ ps -eo user=

распечатает владельца всех в настоящее время рабочих процессов (= подавляет заголовок).

Простой способ получить счета для каждого пользователя:

$ ps -eo user= | sort | uniq -c
  1 dovecot
  1 messagebus
  1 mpd
  1 polkitd
  2 postfix
121 root
 27 me

Можно затем отфильтровать это, как Вы желаете:

$ ps -eo user= | sort | uniq -c | awk '$1 > 42 {print $2}'
root

С пределом в переменной:

$ N=42
$ ps -eo user= | sort | uniq -c | awk -v limit="$N" '$1 > limit {print $2}'
root
8
13.04.2017, 15:36
2 ответа

Я использую это, чтобы получить его, но это зависит от запущенной сессии:

if [[ -z $DBUS_SESSION_BUS_ADDRESS ]]; then
    pgrep "gnome-session" -u "$USER" | while read -r line; do
        exp=$(cat /proc/$line/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=")
        echo export "$exp" > ~/.exports.sh
        break
    done
    if [[ -f ~/.exports.sh ]]; then
        source ~/.exports.sh
    fi
fi

Измените 'gnome' на любую другую сессию, которая у вас есть (она должна быть запущена).

2
27.01.2020, 20:13

По сути, ответ @dashey, но обновленный, чтобы предотвратить warning: command substitution: ignored null byte in inputпредупреждение и не использовать файл для переменной среды:

if [[ -z $DBUS_SESSION_BUS_ADDRESS ]]; then
  while read -r sessionId; do
    # so for each session id, grep the environment from /proc/id/environ for the dbus address
    grepVarMatch=$(grep -z "^DBUS_SESSION_BUS_ADDRESS=" /proc/$sessionId/environ | tr -d '\0')
    if [[ "$grepVarMatch" != "" ]]; then
      # set the address as an envvar in the sudo env
      export DBUS_SESSION_BUS_ADDRESS="${grepVarMatch#*=}"
      break # if we found it, we don't need to look further
    fi
  done <<< "$(pgrep "gnome-session" -u "$USER")"
fi
0
29.03.2021, 09:06

Теги

Похожие вопросы