Ps comando e grep


8

Perché ps -ef | grep $$mostra il grepcomando nell'elenco dei processi? L' grepesecuzione non psè terminata la sua opera?


Si chiama pipeline ...
Ipor Sircer

Se aspettasse fino al termine del primo comando, come funzionerebbero le pipeline con comandi che non si fermano da soli, come tail -f filename | grep pattern?
Barmar,

Risposte:


11

Quando si eseguono i piping dei comandi, tutti i processi vengono avviati contemporaneamente e si fermano (bloccano) fino a quando l'I / O non li inserisce / esce. La shell non bufferizza l'output e lo mantiene fino a quando un processo non è stato completato, quindi lo trasferisce a un altro processo.

Per esempio:

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

Risultati in:

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

Puoi vedere lo stato del processo grep nella struttura / proc:

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

Puoi anche vedere che entrambi i greps sono collegati alla stessa pipeline (id 57573438) e che lo STDOUT ( 1) del primo processo è collegato allo STDIN ( 0) del secondo processo.

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

è un po 'un esempio complesso però dire che dormono e quindi inserire un comando sleep' cos quindi quando dice sleep è il tuo comando sleep piuttosto che qualcosa che viene fatto dalla shell
barlop

Ho appena inserito il comando sleep per introdurre un po 'di ritardo in modo da poter dare un'occhiata al sistema. Il comando sleep non ha alcun impatto sul grep dietro di esso, tranne per il fatto che grep non riceve alcun input. Se ti rende felice, puoi fare la stessa cosa con tar: $ tar -zcvf test.tgz /lib/ | grep foo | grep bare quindi controllare il grep:$ cat status Name: grep State: S (sleeping)
mtak

L'ho già modificato, quindi è più chiaro.
mtak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.