dd – wyświetlanie postępu wykonywania kopii

spece_IT_linux1_210Nawet „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 in
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 😉

Przeczytaj także...

3 komentarze

  1. Adam napisał(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

  2. Marcin napisał(a):

    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

  3. Ewa Wierciak napisał(a):

    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=…)…

Dodaj komentarz