
> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
>
Зачем "w" нужен urandom? Как этого избежать?
ОБНОВЛЯТЬ:
> strace w 2>&1 | awk '/urandom/'
read(4, "awk\0/urandom/\0", 2047) = 14
>
то есть фильтрация как-то связана с урандомом?
> strace who 2>&1 | grep urandom
>
Тогда почему вопрос «кто» не затрагивается?
решение1
жотображает информацию о пользователях, находящихся в данный момент на машине,и их процессы
Чтобы отобразить процессы пользователей, он проходит по всем процессам, запущенным на машине. Давайте попробуем это:
$ strace -o w.trace w | grep whatever
Внутри трассировки мы находим такие строки (в системе Linux):
open("/proc/8286/cmdline", O_RDONLY) = 4
read(4, "grep\0whatever\0", 2047) = 14
Что показывает w
явный проход /proc
и просмотр командных строк всех процессов (и других вещей, которые не показаны). Он находит тот, grep
который работает параллельно ему, и это то, что strace
он видит. Канал не имеет к этому никакого отношения, кроме запуска обоих процессов одновременно. В некотором смысле, это похоже на ps | grep
просмотр самого grep.
who
а большинству других команд не нужна информация о процессах, и они не ищут ее, поэтому при их трассировке вы не увидите того же самого.
решение2
Как объяснялось в других ответах и комментариях, причина того, что вы наблюдаете, заключается в способе Bash
обработки труб. Чтобы отфильтровать то, что вы действительно хотите в подобных ситуациях, вы можете попробовать заключить первую букву аргумента grep
в []
следующем виде:
$ strace w 2>&1 | grep random
read(4, "grep\0random\0", 2047) = 12
$ strace w 2>&1 | grep '[r]andom'
$ strace w 2>&1 | grep '[c]lose'
close(3) = 0
close(3) = 0
close(3) = 0
close(3) = 0
close(3) = 0
close(3) = 0
(...)
РЕДАКТИРОВАТЬ:
Как правильно заметилР.вкомментарий нижена самом деле strace
не видит другую сторону трубы. Аналогично тому, ps aux | grep grep
что также показывает grep grep
в своем выводе, w
это идет по
/proc
каталогу и находит grep
там процесс.