Portál AbcLinuxu, 25. července 2025 15:25
pv /dev/zero > /dev/sdaX
Program "pv" vezme obsah souboru /dev/zero, kopíruje ho na výstup a do toho ukazuje průběh. Pokud je vstup nějak omezen (např. je to normální soubor), ukáže kolik toho má v procentech, zbývající čas atd. Pokud neví (např. vstupem je roura), ukazuje jen kolik přenesl dat. Zařízení /dev/sdaX je pak normální fyzický disk, který má nějakou velikost.
Ve výše zmíněném případě má k dispozici pv jen zařízení /dev/zero, které je nekonečné, a zapisuje na svůj standardní výstup, který by měl být (pro něj) také nekonečný.
Tak to ale není! Ve skutečnost pv (správně) zobrazil průběh tak, že počítá s celkovou velikostí /dev/sdaX! Jak je to možné? To přesměrování do zařízení přece zařídil bash, ne? Jak se pv dozví velikost něčeho, co je schované za rourou?
Díky Řešení dotazu:
pv -s `blockdev --getsize64 /dev/sdaX` /dev/zero > /dev/sdaX
# pv /dev/zero > /dev/sdc 644MiB 0:00:12 [4,37MiB/s] [> ] 1% ETA 0:18:25(všimněte si toho odhadu času, procent apod.) Když dám mezi pv a zařízení ještě třeba gzip, tak už tam žádný odhad není.
Zeroing a disk: pv < /dev/zero > /dev/sda Note that if the input size cannot be calculated, and the output is a block device, then the size of the block device will be used and pv will automatically stop at that size as if -S had been given.
pv < soubor | další příkazy…pv se nějak domákne velikost toho vstupního souboru. Když zadám
cat soubor | pv | další příkazy…už tu velikost nezjistí. V čem je ten rozdíl? Lze nějak zjistit typ roury, co za ní „sedí“?
pv > soubor
, tak shell otevře soubor
a tím na něj získá file descriptor. Když pak shell spustí pv, tak mu tenhle file descriptor předá (spolu s stdin/err, co vedou na terminál), takže ve výsledku je situace stejná, jako by si pv ten soubor otevřelo samo. Pak už stačí zavolat nějaké to ioctl a zjistit, co je potřeba.
Pokud se použije |, tak shell vyrobí nepojmenovanou rouru, čímž získá dva file descriptory – jeden na začátek a druhý na konec. Stejným způsobem pak jednotlivé file descriptory předá odpovídajícím programům. Takže když pak pv chce použít ioctl jako předtím, tak je za file descriptorem roura a ne blokové zařízení.
stale si pletes dva pojmy ... roura (|) a presmerovani (> , >> , < , <<) .. U roury to fakt neni jak zjistit
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.