Perché ps -ef | grep $$mostra il grepcomando nell'elenco dei processi? L' grepesecuzione non psè terminata la sua opera?
tail -f filename | grep pattern?
Perché ps -ef | grep $$mostra il grepcomando nell'elenco dei processi? L' grepesecuzione non psè terminata la sua opera?
tail -f filename | grep pattern?
Risposte:
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
$ tar -zcvf test.tgz /lib/ | grep foo | grep bare quindi controllare il grep:$ cat status Name: grep State: S (sleeping)