ps aux --sort=-%cpu | grep -v 'whoami'
должна выводить процессы, которые не были запущены эффективным пользователем. Тем не менее, он распечатывает процессы моего пользователя, а также других пользователей. Пожалуйста, объясните, что не так.
grep -v 'whoami'
исключает строки, совпадающие с литеральной строкой whoami
Если вы хотите исключить строки, совпадающие с выходными данными команды whoami
, вам необходимо заменить одинарные кавычки на обратные кавычки
ps aux --sort=-%cpu | grep -vFe `whoami`
или используйте вместо него форму $(...)
подстановки команд
ps aux --sort=-%cpu | grep -vFe "$(whoami)"
В качестве альтернативы, вы можете вообще пропустить grep
, отменив выбор пользователя напрямую:
ps -Nu `whoami` --sort=-%cpu u
Как уже объяснил ответ SteelDriver , ваша команда неверна, поскольку она фильтрует по литеральной строке whoami
, и вы можете использовать grep -v "$(whoami)"
; Вы также можете использовать grep -v "$USER"
для достижения желаемого эффекта.
Другим, лучшим способом было бы позволить ps
обрабатывать фильтрацию с помощью -Nu
, как показал Steeldriver, или top
:
$ top -u '!root' -n 1
Однако я бы порекомендовал вам использовать фактическое имя входа - буквенная строка - как в grep -v 'myuser'
по трем причинам:
Можно создать пользователя с символом *
:
$ sudo -p ">" useradd -s /bin/bash -p "$(mkpasswd -m SHA-512 '123')" 'myuser1*'
>
$ su 'myuser1*'
Password:
myuser1*@eagle:/home/xieerqi$
Почему это важно ? Поскольку, когда вы используете $()
без кавычек, подстановочный знак может стать проблемой с глобализацией оболочки, если существуют файлы, которые могут содержать часть имени пользователя, тогда команда прервется:
myuser1*@eagle:/home/xieerqi$ ps aux | strace -e execve grep -v
$(whoami) > /dev/null
execve("/bin/grep", ["grep", "-v", "myuser1.pdf", "myuser1.txt"],
[/* 82 vars */]) = 0
+++ exited with 1 +++
Обратите внимание, как расширилась оболочка myuser1*
в myuser1.pdf
и myuser1.txt
, в соответствии с оболочкой оболочки. Не то, что вы ожидали, верно?
Вторая причина - если вы входите под несколькими именами пользователей (что могут делать некоторые системные администраторы) или если открыто несколько терминалов, вы можете запутаться из-за whoami
output:
$ whoami
root
$ logname
xieerqi
Если вы намерены отфильтровать root
процессы, это будет работать, но если вы вошли как root
, но хотите отфильтровать процессы вашего администратора - whoami
не даст вам того, что вы хотели.
Переменные окружения могут быть не установлены:
$ unset USER
$ echo "empty $USER ?"
empty ?
Итак, что мы узнали из этого?
grep