8

Почему ps -ef | grep $$ показывает команду grep в списке процессов? Разве не выполняется grep после того, как ps is завершил свою работу?

1 ответ1

11

При передаче команд все процессы запускаются одновременно, и они просто спят (блокируются) до тех пор, пока I/O не войдет / не выйдет из них. Оболочка не буферизует вывод и не удерживает его до завершения одного процесса, а затем передает его другому процессу.

Например:

mtak@rubiks:~$ tar -zcvf test.tgz /lib/ | grep bla | grep foo | grep bar

Результаты в:

mtak 28813 28799  0 12:35 pts/17   00:00:00 tar -zcvf test.tgz /lib/
mtak 28814 28799  0 12:35 pts/17   00:00:00 grep --color=auto bla
mtak 28815 28799  0 12:35 pts/17   00:00:00 grep --color=auto foo
mtak 28816 28799  0 12:35 pts/17   00:00:00 grep --color=auto bar

Вы можете увидеть состояние процесса grep в дереве /proc:

mtak@rubiks:~$ grep State /proc/28814/status
State:  S (sleeping)

Вы также можете увидеть, что оба greps подключены к одному и тому же конвейеру (id 57573438) и что STDOUT (1) первого процесса подключен к STDIN (0) второго процесса.

root@rubiks:~# ls -l /proc/28815/fd
total 0
lr-x------ 1 mtak mtak 64 dec  1 12:35 0 -> pipe:[57573437]
l-wx------ 1 mtak mtak 64 dec  1 12:35 1 -> pipe:[57573438]
lrwx------ 1 mtak mtak 64 dec  1 12:35 2 -> /dev/pts/17

root@rubiks:~# ls -l /proc/28816/fd
total 0
lr-x------ 1 mtak mtak 64 dec  1 12:35 0 -> pipe:[57573438]
lrwx------ 1 mtak mtak 64 dec  1 12:35 1 -> /dev/pts/17
lrwx------ 1 mtak mtak 64 dec  1 12:35 2 -> /dev/pts/17

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .