dd – wyświetlanie postępu wykonywania kopii
Nawet „windziarzom”, raz na jakiś czas nadarza się konieczność wykorzystania narzędzi spod znaku pingwina :). Jednym z takich narzędzi, jest niewątpliwie dd. Ponieważ korzystam z tego bardzo rzadko, dlatego też nigdy nie pamiętam, aby ew. pobrać jakieś rozszerzone wersje tego bardzo pożytecznego narzędzia z repozytoriów i koniec końców, pracuje na wersji standardowej.
Niewątpliwie, jedną z jego niewielu wad jest fakt, iż nie udostępnia w standardzie żadnego sposobu na podejrzenie postępu wykonywanych kopii.
Można co prawda użyć innych narzędzi (np pv) ale … trzeba pamiętać aby je pobrać etc (patrz akapit wyżej).
Na szczęście, można sobie poradzić z w/w niedogodnością dd, za pomocą ciekawej funkcjonalności zmiennych „środowiskowych” bash’a, a konkretnie zmiennej „USR1”.
Potrzebny nam będzie ID procesu, pod którym działa dd.
1) Do tego celu, wykorzystujemy pgrep’a
pgrep '^dd$’
2) Dostajemy nr pocesu np.
5283 dd
3) Mając ID procesu, wysyłamy sygnał kill -USR1 o podanym wyżej numerze
kill -USR1 5283
4) dd dostając sygnał USR1, zwróci na standardowe wyjście aktualny stan np.
0+86 records out
2034 bytes (2034 B) copied, 28.32 seconds, 58.0 kB/s
5) Teraz wystarczy w/w zapytanie puścić sobie w pętli, z interwalem powiedzmy 10s
watch -n 10 kill -USR1 5283
Dokładne znaczenie sygnału USR1 oraz jego pobratymcy USR2, pozostawiam linux’iarzom 🙂 Z tego co mi wiadomo, są to sygnały typu „user defined” i w zależności od procesu który je przetwarza, podnoszą/zmieniają poziom logowania, niektóre procesy przeprowadzają jakieś konkretne akcje, a jeszcze inne po prostu je ignorują.
Ogólnie wynik przechwycenie sygnalu SIGUSR1 przez dany proces, zależy od dobrej woli programistów.
Po bliższe info odsyłam do man’a 😉
Podchodziłem dzisiaj 4 razy do napisania komentarza. Rozumiem, że chciałeś zrobić jakąś kopię binarną? A nie łatwiej było użyć FTKImager, tam jest czas i postęp pokazany bez problemów ;p
Witam
Pozwolę sobie zaoponować – to nie jest funkcjonalność bash’a. Luźno za man’em polecenia kill:
„Polecenie kill wysyła określony sygnał do procesu lub grupy procesów. Jeśli nie podano, domyślnym sygnałem jest zakończ proces.” Najbardziej znane i zabójcze to oczywiście kill -9; ale sygnałów jest więcej.
Co do dd – można zrobić to trochę krócej:
dd if=/dev/zero of=/dev/null& pid=$! – kopiuje, przechodzi w tło (&) i nadaje zmiennej pid numer procesu dd
kill -USR1 $pid – wysłanie sygnału USR1 do dd powoduje wyświetlenie statystyk i kontynuacje kopiowania
W części dystrybucji (mojej ulubionej SystemRescueCD też) istnieje program dd_rescue – składnię ma troszeczkę inną, ale nadrabia to zaletami:
– ma wskaźnik postępu kopiowania (bardzo rozbudowany – odczyt, zapis, inne statystyki)
– wspiera funkcje przydatne w przypadku odczytu z uszkodzonych nośników (np. HDD) – ponowia odczyty, zwalnia prędkość – zwykłe dd przerywa pracę z komunikatem o błędzie I/O
Pozdrawiam
Ciekawe podejście :), jak wiadomo w świecie linux-owym dróg do rozwiązania danego zagadnienia zawsze jest kilka i każdy może wybrać tą którą lubi najbardziej. Nie mogę jednak przejść spokojnie nie skomentujac, że komenda dd jest komendą dos-ową a nie linux-ową. Tak, coś udało się Panom z „jedynej słusznej firmy” od systemów :D. Legenda głosi natomiast, iż tak spodobała się ta komenda „linux-iarzom”, że postanowili zachować jej konstrukcję (stąd mamy nietypowe dla komend linux-owych if=… of=…)…