Если бы он дождался завершения первой команды, как конвейеры будут работать с командами, которые не останавливаются сами по себе, например tail -f filename | grep pattern?
При передаче команд все процессы запускаются одновременно, и они просто спят (блокируются) до тех пор, пока I / O не войдет / не выйдет из них. Оболочка не буферизует вывод и не удерживает его до завершения одного процесса, а затем передает его другому процессу.
Например:
mtak@rubiks:~$ tar -zcvf test.tgz /lib/ | grep bla | grep foo | grep 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
Это немного сложный пример, хотя сказать, что они спят, а затем ввести команду сна, потому что тогда, когда он говорит, что сон, это ваша команда сна, а не что-то, что делается оболочкой
barlop
Я просто добавил туда команду сна, чтобы ввести некоторую задержку, чтобы я мог осмотреть систему. Команда sleep не влияет на grep, стоящий за ней, за исключением того, что grep не получает никакого ввода. Если это делает вас счастливым, вы можете сделать то же самое с tar: $ tar -zcvf test.tgz /lib/ | grep foo | grep barи затем проверить grep:$ cat status Name: grep State: S (sleeping)
tail -f filename | grep pattern
?Ответы:
При передаче команд все процессы запускаются одновременно, и они просто спят (блокируются) до тех пор, пока I / O не войдет / не выйдет из них. Оболочка не буферизует вывод и не удерживает его до завершения одного процесса, а затем передает его другому процессу.
Например:
Результаты в:
Вы можете увидеть состояние процесса grep в дереве / proc:
Также видно, что оба greps подключены к одному и тому же конвейеру (id
57573438
) и что STDOUT (1
) первого процесса подключен к STDIN (0
) второго процесса.источник
$ tar -zcvf test.tgz /lib/ | grep foo | grep bar
и затем проверить grep:$ cat status Name: grep State: S (sleeping)