Необходимо сократить объемы производства столбцов 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
Я использую это, чтобы получить его, но это зависит от запущенной сессии:
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' на любую другую сессию, которая у вас есть (она должна быть запущена).
По сути, ответ @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