Re: im Skript feststellen ob ein Verzeichnis leer ist
Frank Dietrich schrieb:
> wlt@bluewin.ch (Walter Saner) wrote:
>
> >| wal@tek:~$ time ls -R -AU /usr/share | wc
> >| 51909 49256 737261
> >|
> >| real 0m0.546s
>
> Das sind in meinem Fall hier beim erstem 'ls' 31.8 Sekunden.
Das erscheint mir doch ein büschen sehr lang. Die erste Ausführung
der obigen Pipe dauerte hier ca. 1.1 Sekunden. Und tek hat seine
besten Jahre schon lange hinter sich.
> >| wal@tek:~$ time ls -R -AU /usr/share | head -1 > /dev/null
> >|
> >| real 0m0.018s
>
> 0.02 sek - perfekt (ich hätte es einfach probieren sollen)
>
> Aber kannst Du mir erklären was da genau passiert?
Der schreibende Prozess erhält das Signal SIGPIPE, wenn der lesende
Prozess die Pipe schliesst.
| wal@tek:~$ strace -e trace=signal ls -R -AU /usr/share | head -1
| rt_sigaction(SIGRTMIN, {0x401665d0, [], SA_SIGINFO}, NULL, 8) = 0
| rt_sigprocmask(SIG_UNBLOCK, [RTMIN], NULL, 8) = 0
| /usr/share:
| --- SIGPIPE (Broken pipe) @ 0 (0) ---
| +++ killed by SIGPIPE +++
> Ich war den Meinung alles was ls in die Pipe reinschreibt müsse auch
> wieder herausgelesen werden. Das scheint aber ja wohl dann nicht der
Wie willst du einen lesenden Prozess dazu zwingen - mit vorgehaltener
Waffe? ;-)
> Fall zu sein. Wie kommt also die Meldung vom head zu ls das es nicht
> weiter Daten liefern muß?
Das ist Sache des Kernels.
Ciao
Walter
Reply to: