> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
>
Зачем "W" нужен случайный? Как этого избежать?
ОБНОВИТЬ:
> strace w 2>&1 | awk '/urandom/'
read(4, "awk\0/urandom/\0", 2047) = 14
>
так что фильтрация как-то связана с урандом?
> strace who 2>&1 | grep urandom
>
Тогда почему «кто» не пострадал?
w
что нужноurandom
. Это потому чтоPiped commands run concurrently
: unix.stackexchange.com/questions/37508/…urandom
доступа вw
исходном коде.grep
и вашуawk
. Это неw
открытие/dev/urandom
файла устройства. Это похоже наps -aux | grep grep
strace w 2>&1 | grep unicorns
;-)Ответы:
Как объясняется в других ответах и комментариях, причина того, что вы наблюдаете, заключается в способе
Bash
обработки труб. Чтобы отфильтровать то, что вы действительно хотите в подобных ситуациях, вы можете попытаться заключить первую буквуgrep
аргумента[]
следующим образом:РЕДАКТИРОВАТЬ:
Как правильно заметил Р. в комментарии ниже, на самом деле
strace
не видит другую сторону трубы. Аналогично тому,ps aux | grep grep
что также показываетgrep grep
в своем выводе,w
идет через/proc
каталог и находитgrep
там процесс.источник
strace
не отслеживает (и не может каким-либо простым способом) другие команды в конвейере оболочки. Скорее,w
ищет текущие команды, выполняемые на вашем терминале (и других терминалах), и проходит через grep как часть своей работы.Из справочной страницы
w(1)
:Чтобы отобразить пользовательские процессы, он проходит через все процессы, запущенные на машине. Давайте попробуем это:
Внутри трассировки мы находим такие строки (в системе Linux):
Который показывает
w
явное прохождение/proc
и просмотр командных строк всех процессов (и других вещей, не показаны). Он находит то,grep
что идет параллельно с ним, и вот чтоstrace
он видит. Канал не имеет к этому никакого отношения, кроме запуска обоих процессов одновременно. В некотором смысле это похожеps | grep
на саму grep.who
и большинству других команд не нужна информация о процессах, и они не ищут, поэтому вы не видите их при отслеживании.источник