it-swarm-ko.tech

dd가 여전히 작동하는지 어떻게 알 수 있습니까?

나는 dd를 그다지 많이 사용하지는 않았지만, 아직까지 실패하지는 않았습니다. 현재 dd에 12 시간 이상갔습니다. 이미지를 디스크에 다시 기록하고 있습니다. dd 약 7 시간 동안 디스크에서 이미지로.

4GB RAM의 2.1ghz/core에서 Core 2 Duo가있는 MacBook에서 OSX 10.6.6을 실행하고 있습니다. 7200rpm 하드 드라이브 (부팅 드라이브)의 .dmg를 읽고 SATA-to-USB 커넥터를 통해 연결된 7200rpm 드라이브에 쓰고 있습니다. 기본적으로 블록 크기를 그대로두고 이미지는 약 160gb입니다.

편집 : 그리고 14 시간의 순수한 스트레스 후에 dd는 결국 완벽하게 작동했습니다. 다음 번에는 pv를 통해 실행하고 strace로 추적하겠습니다. 모든 도움을 주셔서 감사합니다.

150
eckza

dd 명령을 사용하여 kill 특정 신호를 보내 현재 상태를 출력 할 수 있습니다. 신호는 BSD 시스템 (OSX 포함)에서는 INFO이고 Linux에서는 USR1입니다. 귀하의 경우 :

kill -INFO $PID

ps 명령으로 프로세스 ID (위의 $PID)를 찾을 수 있습니다. 보다 편리한 방법은 macrep x의 pgrep 및 pkill 대안 을 참조하십시오.

더 간단히 말하자면 AntoineG그의 답변 에서 지적한 것처럼 dd를 실행하는 Shell에서 ctrl-T를 입력하여 INFO 신호를 보낼 수 있습니다 .

Linux의 예로 모든 활성 dd 프로세스 출력 상태를 다음과 같이 만들 수 있습니다.

pkill -USR1 -x dd

상태를 출력 한 후 dd는 계속 대처합니다.

176
Caleb

OS X (Linux에서는 시도하지 않았 음)에서 간단히 입력 할 수 있습니다. Ctrl+T dd를 실행하는 터미널에서. kill -INFO $PID와 동일한 출력과 CPU 사용량이 인쇄됩니다.

load: 1.40  cmd: dd 34536 uninterruptible 3.49u 64.58s
5020305+0 records in
5020304+0 records out
2570395648 bytes transferred in 4284.349974 secs (599950 bytes/sec)

이 스레드를 읽고 터미널에서 새 탭을 열려고하지만 믹싱하는 것에 대해 알았습니다. +T 와 Ctrl+T.

104
AntoineG

dd의 경우 신호 보내기 를 수행 할 수 있습니다. 파일을 읽거나 쓰는 다른 명령의 경우 lsof 을 사용하여 파일에서 해당 위치를 볼 수 있습니다.

lsof -o -p1234    # where 1234 is the process ID of the command
lsof -o /path/to/file

미리 계획 한 경우 pv 를 통해 데이터를 파이프하십시오.

보다 일반적인 방법은 프로그램 당 현재 디스크 읽기/쓰기 양을 표시하는 iotop 를 사용하는 것입니다.

편집하다: iotop -o는 현재 I/O 작업을 수행하는 프로그램 만 표시합니다 (이 주석에 Jason C 감사합니다).

17
jofel

나는 보통 strace를 실행중인 프로세스에 연결합니다 (-p $PID 옵션)을 사용하여 시스템 호출에서 차단 상태를 유지하는지 또는 여전히 활성 상태인지 확인하십시오.

또는 실행중인 dd에 신호를 보내는 것이 긴장된 경우 다른 dd를 시작하여 작동하는지 확인하십시오.

13
philfr

다음에는 처음부터 pv를 사용할 수 있습니다 (패키지 관리자를 통해 사용 가능한 경우 설치). 이것은 출력 및 출력 진행 및 속도 모니터링을 위해 배관 입력만을 목적으로하는 유틸리티입니다.

그런 다음 이미지를 드라이브에 쓰려면 4MB 블록 크기로 말합니다.

pv -ptearb /path/to/image.bin | dd iflag=fullblock of=/dev/whatever bs=4M

초기 버퍼링 (원하는 경우 dd을 통해 수행 할 수있는 최종 동기화에 의한 오프셋) 외에도 진행률 표시 줄, 평균 속도, 현재 속도 및 ETA가 표시됩니다.

iflag=fullblock 옵션은 dd가 pv를 통해 전체 입력 블록을 가져 오도록 강제합니다. 그렇지 않으면 블록 크기에 대한 파이프의 책임이 있습니다.

다른 방법으로 가려면 소스가 블록 장치 인 경우 크기를 명시 적으로 지정해야하지만 dd를 사용하여 읽고 pv를 사용하여 씁니다. 4GB 장치의 경우 :

dd if=/dev/whatever bs=4M | pv -ptearb -s 4096m > /path/to/image.bin

다음과 같이 크기를 자동으로 결정할 수도 있습니다.

dd if=/dev/whatever bs=4M | pv -ptearb -s `blockdev --getsize64 /dev/whatever` > /path/to/image.bin

ddpv에서 어떤 순서로 수행하든 상관없이, 이는 전체 성능과 관련이 있습니다. 읽거나 읽는 장치가 원하는 특정 블록 크기에 대해 최적의 성능을 갖는 경우 해당 장치에 액세스하려면 dd 대신 pv를 사용하십시오. 원하는 경우 양쪽 끝에 dd를 붙이거나 신경 쓰지 않아도 될 수도 있습니다.

pv -ptearb /path/to/image.bin > /dev/whatever
sync
11
Jason C

coreutils v8.24부터 dd는 진행률 표시를 기본적으로 지원합니다. 옵션 status=progress.

예:

dd if=Arch.iso of=/dev/sdb bs=4M status=progress

소스

10

ddrescue은 (는) 실행중인 통계를 제공합니다.

데모 : http://www.youtube.com/watch?v=vqq9A01geeA#t=144s

5
Ben Preston

Dcdddd (1)를 사용하여 dd 작업을 더 잘 보여줍니다.

4
Kartik M

dd 프로세스의 stderr 스트림에 액세스 할 수 없기 때문에 (예 : 실행 된 터미널이 이미 닫혀 있기 때문에) INFO 또는 USR1 신호를 사용하지 못할 수 있습니다. 이 경우 해결 방법은 다음을 수행하는 것입니다 (FreeBSD에서 테스트되었으며 Linux에서는 약간 다를 수 있음).

  1. iostat를 사용하여 대상 장치에 대한 평균 쓰기 속도 (MB/s)를 추정하십시오 (예 :

    iostat -d -w30 ada0

    대상 장치 이름을 ada0 여기에 몇 분 동안 결과가 표시 될 때까지 기다리십시오. "w"매개 변수는 샘플 사이의 시간 (초)을 결정합니다. 값을 늘리면 분산이 적 으면서 평균 추정치가 향상되지만 더 오래 기다려야합니다.

  2. ps을 (를) 사용하여 dd이 (가) 얼마나 오래 실행되었는지 확인하려면 다음을 사용하십시오.

    ps -xo etime,command | grep dd

    총 초 런타임을 얻으려면 이것을 초로 변환하십시오.

  3. 총 전송 시간 (MB)을 얻으려면 총 쓰기 시간 (초)에 평균 쓰기 속도를 곱하십시오.
  4. 다음을 사용하여 장치 크기를 MB 단위로 가져옵니다.

    grep ada0 /var/run/dmesg.boot

    대상 장치 이름을 ada0. 결과를 평균 쓰기 속도로 나누면 총 전송 시간 (초)을 얻을 수 있습니다. 남은 시간을 얻기 위해 지금까지 실행 된 시간을 뺍니다.

이 전략은 dd이 (가) 시작된 이후 현재 평균 쓰기 속도로 지속적으로 쓰고있는 경우에만 작동합니다. 다른 프로세스가 CPU 또는 I/O 리소스 (I/O 버스 포함)를 위해 경쟁하는 경우 전송 속도가 느려질 수 있습니다.

4
D Coetzee

progress 을 사용할 수 있습니다. 특히 실행중인 dd의 진행률을 보여줍니다. /proc/$pid/fd/proc/$pid/fdinfo 직접 모니터링 할 수도 있습니다.

3
jofel

dd이 실행되는 동안 다른 터미널에서 루트로 이것을 실행합니다.

while pgrep ^dd; do pkill -INFO dd; sleep 1; done

1 초마다 dd 상태를 인쇄합니다. 원래 터미널 창에서 여기서 dd이 실행되고 명령이 완료되면 종료됩니다.

2
ccpizza

/proc/$pid/iowchar 줄 (문자 쓰기)은 dd 프로세스에 대한 정확한 정보를 제공 할 수 있습니다. 변경되는 한 dd은 (는) 계속 작동합니다!

다음은 깔끔한 작은 PHP 스크립트입니다. dd 중에 php filename.php로 저장 한 다음 바이트를 표시 할 수 있습니다. kill -USR1 $(pidof dd)보다 /proc/$pid/io을 (를) 보는 좋은 이점은 터미널간에 전환 할 필요가 없다는 것입니다. 항상 옵션은 아닙니다.

<?php

/** Time between refreshs in seconds */
$refresh = 1;


/**
 * Start of Script 
 */

if (!($pid = exec('pidof dd')))
    exit("no dd running\n");

$history = array();
$break_ms = $refresh * 1000000;
$start_time = exec("ls -ld /proc/$pid --time-style=+\"%s\" | egrep -o [0-9]{10}");


fprintf(STDOUT, "PID: %s\n", $pid);
fprintf(STDOUT, "START TIME: %s\n\n", date("Y-m-d H:i:s", $start_time));


while (true) {
    if (isset($curr))
        array_Push($history, $curr);

    if (count($history) > 10) array_shift($history);
    $oldest = reset($history);
    $latest = end($history);

    /**
     * get number of written bytes from /proc/$pid/io
     */
    #if (!($curr = exec("cat /proc/$pid/io | grep ^write_bytes | sed 's/write_bytes: //g'")))
    #    break;

    /* prepare proc_open() parameter */
    $descriptorspec = array(
        0 => array('pipe', 'r'), // stdin
        1 => array('pipe', 'w'), // stdout
        2 => array('pipe', 'w'), // stderr
    );

    $process = proc_open("cat /proc/$pid/io | grep ^write_bytes | sed 's/write_bytes: //g'", $descriptorspec, $pipes);
    if (!is_resource($process)) break;

    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    proc_close($process);

    if (!empty($stderr)) break;
    $curr = trim($stdout);

    /**
     * caculate elapsed time from start */
    $time_elapsed = time() - $start_time;

    /**
     * avg speed since start */
    $avg = $time_elapsed > 0 ? round($curr / $time_elapsed) : 0;

    /**
     * avg speed of last 10 updates */
    if (count($history) > 0)
        $speed = human_file_size(round(($latest - $oldest) / count($history) / $refresh));

    $output = sprintf("\rBYTES WRITTEN: %s [%s]  ::  CURRENT: %s/s  ::  AVERAGE: %s/s  ::  ELAPSED: %s", $curr, human_file_size($curr), isset($speed) ? $speed : 0, human_file_size($avg), gmdate("H:i:s", $time_elapsed));
    printf("%s%s", $output, str_repeat(" ", exec("tput cols") - strlen($output)));

    usleep($break_ms);
}

fprintf(STDOUT, "\ndd has finished!\n\n");

function human_file_size($size,$unit="") {
  if( (!$unit && $size >= 1<<30) || $unit == "GB")
    return number_format($size/(1<<30),2)." GB";
  if( (!$unit && $size >= 1<<20) || $unit == "MB")
    return number_format($size/(1<<20),2)." MB";
  if( (!$unit && $size >= 1<<10) || $unit == "kB")
    return number_format($size/(1<<10),2)." kB";
  return number_format($size)." bytes";
}
1
Leon Kramer