Ps командування та греп


8

Чому ps -ef | grep $$відображається grepкоманда у списку процесів? Хіба не grepстрачений після psзакінчення своєї роботи?


Це називається трубопровід ...
Іпор Сірсер

Якщо б він дочекався завершення першої команди, як би трубопроводи працювали з командами, які не зупиняються самостійно, як tail -f filename | grep pattern?
Бармар

Відповіді:


11

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

Наприклад:

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)

Ви також можете бачити, що обидві грейпи підключені до одного трубопроводу (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

це трохи складний приклад, хоч сказати, що вони сплять, а потім
увімкнути

Я просто помістив туди команду сну, щоб ввести деяку затримку, щоб я міг озирнутися в системі. Команда сну не впливає на греп за ним, за винятком того, що греп не отримує жодного вводу. Якщо це робить вас щасливим, ви можете зробити те саме, що і з дьогтем: $ tar -zcvf test.tgz /lib/ | grep foo | grep barа потім перевірити grep:$ cat status Name: grep State: S (sleeping)
mtak

Вже його відредагували, тож ясніше.
mtak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.