আমি কীভাবে জানতে পারি যে ডিডি এখনও কাজ করছে?


147

আমি এত কিছু ব্যবহার করি নি dd, তবে এখনও পর্যন্ত এটি আমার ব্যর্থ হয়নি। এই মুহুর্তে, আমি dd12 ঘন্টা ধরে যাচ্ছিলাম - আমি যে ডিস্কটি থেকে এসেছি সেটিতে আবার একটি চিত্র লিখছি - এবং আমি কিছুটা চিন্তিত হচ্ছি, যেহেতু আমি ddডিস্ক থেকে ছবিটিতে প্রায় সক্ষম হয়েছি 7 ঘন্টা.

আমি 4 জিবি র‌্যাম সহ 2.1ghz / কোর এ কোর 2 ডুও সহ একটি ম্যাকবুকে OSX 10.6.6 চালাচ্ছি। আমি একটি 7200 আরপিএম হার্ড ড্রাইভ (বুট ড্রাইভ) এ .dmg থেকে পড়ছি, এবং আমি একটি স্যাটা-টু-ইউএসবি সংযোগকারীটির সাথে সংযুক্ত একটি 7200 আরপিএম ড্রাইভে লিখছি। আমি ব্লকসাইজটি ডিফল্ট অবস্থায় রেখে এসেছি এবং চিত্রটি প্রায় 160 জিবি।

সম্পাদনা: এবং, বিশুদ্ধ চাপের 14 ঘন্টা পরে, ddপুরোপুরি পুরোপুরি কাজ করেছে। পরের বার, যদিও, আমি এটি চালাতে যাচ্ছি এবং এটি দিয়ে pvট্র্যাক করব strace। আপনার সমস্ত সহায়তার জন্য প্রত্যেককে ধন্যবাদ।


7
আপনার প্রশ্নের উত্তর দিচ্ছে না, তবে আপনার সময়গুলি বেশ উচ্চ আইএমও। আপনার কি মনে হয়েছে ডিফল্ট 512 বাইট ছাড়া অন্য কোনও বড় ব্লকের আকার ডিডি করতে হবে? dd ... bs=16Mআপনার প্রস্তাবনাটি হল, আপনার র‌্যাম, ডিস্কের আকার এবং গতি দেওয়া।
জুলিয়ানো

আমি তা করি নি, কেবল কারণ আমি এটি নিরাপদ খেলতে চেয়েছিলাম। যদিও আমি পরের বার চেষ্টা করব। ধন্যবাদ।
একজা

আমার অভিজ্ঞতায় ddম্যাক ওএস এক্স-তে এমন একটি প্রবণতা রয়েছে যেখানে আমি প্রক্রিয়াটিও মেরে ফেলতে পারি না, তবে সিস্টেমটি পুনরায় চালু করতে হবে। আমি তখন একটি লিনাক্স ভিএম-তে কাজ করার অবলম্বন করি।
এসএসসি

উত্তর:


174

আপনি কমান্ডটি ddব্যবহার করে killএটির বর্তমান অবস্থা আউটপুট তৈরি করতে একটি নির্দিষ্ট সংকেত পাঠাতে পারেন । সংকেতটি INFOBSD সিস্টেমে (ওএসএক্স সহ) এবং USR1লিনাক্সে রয়েছে। আপনার ক্ষেত্রে:

kill -INFO $PID

কমান্ডের $PIDসাহায্যে প্রক্রিয়া আইডি ( উপরে) সন্ধান করতে পারেন ps; অথবা আরও সুবিধাজনক পদ্ধতির জন্য ম্যাক ওএস এক্স-এ pgrep এবং pkill বিকল্পগুলি দেখুন।

আরও সহজভাবে, এন্টোইনজি যেমন তার উত্তরে উল্লেখ করেছে , আপনি সিগন্যালটি ctrl-Tপ্রেরণ করতে শেল চলমান ডিডিতে টাইপ করতে পারেন INFO

লিনাক্সের উদাহরণ হিসাবে, আপনি সমস্ত সক্রিয় ddপ্রক্রিয়াগুলিকে এভাবে আউটপুট স্থিতি তৈরি করতে পারেন:

pkill -USR1 -x dd

এর স্থিতি আউটপুট দেওয়ার পরে, ddকপি করা অবিরত থাকবে।


9
ওহ, খুব দুর্দান্ত আপনি তাদের সাথে একত্রিত করতে পারেনpkill -USR1 -x dd
মাইকেল মরোজেক

9
@ কিভেট্রস: বিএসডি সিস্টেমে আপনাকে INFOসিগন্যাল প্রেরণ করতে হবে । লিনাক্সের একটি সিগিনফো নেই এবং USR1পরিবর্তে ব্যবহার করে uses
গিলস

5
সিগুএসআরএক্স সিগন্যালগুলি প্রোগ্রামগুলির একটি মানকৃত অর্থের বিরোধী হিসাবে তারা যা চায় তা করার জন্য। উদাহরণস্বরূপ, সাইনচিনচ উত্থাপিত হয় যখন টার্মিনালটির আকার পরিবর্তিত হয় এবং প্রোগ্রামটির পর্দা পুনরায় আঁকার প্রয়োজন। অপারেটিং সিস্টেমটি SIGUSRx গুলি প্রেরণ করে না তাই তারা কাস্টম ব্যবহারের জন্য উপলব্ধ।
লরেন্স

11
ইউএসআর 1 সিগন্যালটি প্রেরণের খুব শীঘ্রই প্রেরণ করা (অর্থাত্ কোনও ব্যাশ স্ক্রিপ্টে, আপনি এটি শুরু করার পরে লাইনটি) আসলে এটি বন্ধ করে দেবে। এর মধ্যে একটি 0.1 সেকেন্ডের ঘুম রাখুন এবং এটির অগ্রগতিটি সঠিকভাবে আউটপুট করবে। যাইহোক, ইউএসআর 1 / আইএনএফও চালু করার জন্য একটি খুব সুন্দর ডিডি কমান্ড dd if=/dev/zero of=/dev/null। :)
লরিজ ভি ভি থালালো

11
বিটিডাব্লু, সমস্ত "সত্য" বিএসডি যদি স্থিতি অক্ষর (ডিফল্টরূপে Ctrl + T) টার্মিনালে প্রেরণ করা হয় তবে অগ্রভাগ প্রক্রিয়া গোষ্ঠীতে SIGINFO প্রেরণ করে। তবে ম্যাকোএসএক্সের পক্ষে এটি সত্য কিনা তা আমি জানি না।
নেটচ

101

ওএস এক্স এর অধীনে (লিনাক্সে চেষ্টা করেনি), আপনি টার্মিনাল চলমানটিতে কেবল Ctrl+ টাইপ করতে পারেন । এটি একই আউটপুট , পাশাপাশি সিপিইউ ব্যবহার মুদ্রণ করবে :Tddkill -INFO $PID

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


1
ওহ, ঠিক আছে, তাই loadকি সিপিইউ ব্যবহার?
pj

এটি এত ভাল সমাধান ছিল!
স্টেফএন_আর

আমি লিনাক্সে ডিডি চেষ্টা করেছিলাম, এটি কেবল ^Tটার্মিনালের প্রতিধ্বনি করে।
mwfearnley

1
আপনি ম্যাক টার্মিনালে
সিটিআরএল

26

জন্য dd, আপনি একটি সংকেত পাঠাতে পারেন । অন্যান্য কমান্ডগুলির জন্য যা কোনও ফাইল পড়ছে বা লিখছে, আপনি ফাইলটিতে তাদের অবস্থানটি দেখতে পারেন lsof

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

আপনি যদি আগে থেকে পরিকল্পনা করেন তবে ডেটাটি পাইপ করুন pv


1
পিভি আশ্চর্যজনক দেখাচ্ছে - আমি অবশ্যই পরবর্তী সময়টি ব্যবহার করতে যাচ্ছি। তোমাকে অনেক ধন্যবাদ.
একজা

1
+1 - pvদেখতে টিকিটের মতো দেখাচ্ছে।
Boehj

17

আরও সাধারণ উপায় হ'ল ব্যবহার করা iotopযা প্রতি প্রোগ্রামে ডিস্ক পাঠ / লেখার বর্তমান পরিমাণ প্রদর্শন করে।

সম্পাদনা: iotop -oকেবলমাত্র সেই প্রোগ্রামগুলি দেখান যা বর্তমানে আই / ও অপারেশন করে ( এই মন্তব্যটির জন্য জেসন সি ধন্যবাদ )।


1
এটি আমার পছন্দের দ্রুত চেক পদ্ধতিও। iotop -oআইও করছে না এমন প্রক্রিয়াগুলি লুকিয়ে রাখবে এবং কী চলছে তা এক নজরে বলা সহজ করে তুলবে।
জেসন সি

13

আমি সাধারণত এটির straceকোনও চলমান প্রক্রিয়ার সাথে ( -p $PIDবিকল্পটি দিয়ে) সংযুক্ত করে দেখি যে এটি কোনও সিস্টেমে কল করে বা এটি এখনও সক্রিয় রয়েছে কিনা তা অবরুদ্ধ থাকে।

অথবা, আপনি যদি চলমান ডিডিতে সংকেত প্রেরণে নার্ভাস বোধ করেন তবে এটি কাজ করে যদি যাচাই করতে অন্য একটি ডিডি শুরু করুন।


2
আপনি সংযুক্তি সম্পর্কে ঠিক কীভাবে যাবেন strace? এছাড়াও, আমি অন্যটি শুরু করেছিলাম ddএবং এর মধ্যে প্রস্তাবিত সংকেতগুলির মধ্যে একটি পাঠিয়েছি এবং ... এটি এটি হত্যা করেছে।
একজা

2
আপনি যদি চলমান ডিডি প্রক্রিয়াটির পিড জানেন তবে কেবল স্ট্রেস-পি <পিড> করুন। প্রক্রিয়া দ্বারা কল করা সমস্ত সিস্টেম কলগুলির লগটি আপনার দেখতে হবে (বেশিরভাগই পড়ুন এবং লিখুন)
ফিলাফার

11

পরবর্তী সময়ের জন্য, আপনি কেবল pvশুরু থেকেই ব্যবহার করতে পারেন (এটি যদি আপনার প্যাকেজ পরিচালকের মাধ্যমে পাওয়া যায় তবে এটি ইনস্টল করুন)। আউটপুট ইনপুট পাইপিং এবং অগ্রগতি এবং গতি নিরীক্ষণের একমাত্র উদ্দেশ্য সহ এটি একটি ইউটিলিটি।

তারপরে, ড্রাইভে একটি চিত্র লেখার জন্য, 4 এমবি ব্লক আকারের সাথে বলুন:

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

প্রাথমিক বাফারিং বাদে (একটি চূড়ান্ত সিঙ্ক দ্বারা অফসেট, যা ddআপনি চাইলে এটি করা যায়), এটি আপনাকে অগ্রগতি বার, গড় গতি, বর্তমান গতি এবং ইটিএ দেখায় show

iflag=fullblockবিকল্প শক্তির মাধ্যমে ইনপুট পূর্ণ ব্লক দখল করতে dd pv, অন্যথায় আপনি ব্লক মাপ জন্য পাইপ রহমত করছি।

অন্যভাবে যেতে ডিডি পড়তে এবং পিভি লিখতে ব্যবহার করুন, যদিও উত্সটি কোনও ব্লক ডিভাইস হলে আপনাকে স্পষ্টভাবে আকার নির্দিষ্ট করতে হবে। একটি 4 জিবি ডিভাইসের জন্য:

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

এটা সত্যিই কোন ব্যাপার না কি অর্ডার আপনাকে যা করতে ddএবং pv, এটা সম্পূর্ণরূপে কার্যসম্পাদনা সংক্রান্ত নেই - ডিভাইস আপনার কাছে বা থেকে পড়া হয় নির্দিষ্ট blocksizes আপনি ব্যবহার করতে চান তাদের জন্য অনুকূল কর্মক্ষমতা হয়েছে থাকে ddপরিবর্তে pvযে ডিভাইসে অ্যাক্সেস করতে। আপনি চাইলে ddউভয় প্রান্তেও আটকে রাখতে পারেন, বা যত্ন না নিলে মোটেও নয়:

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


5

ddrescue চলমান হিসাবে আপনি পরিসংখ্যান দেবে

ডেমো: http://www.youtube.com/watch?v=vqq9A01geeA#t=144s


3
এটি পরের বারের জন্য সহায়ক হতে পারে তবে এটি ওপিকে বর্তমান কমান্ড হিমশীতল কিনা তা বুঝতে সাহায্য করবে না।
ফ্রান্সেস্কো টার্কো

4

কখনও কখনও আপনি INFO বা USR1 সিগন্যাল ব্যবহার করতে পারবেন না কারণ ddপ্রক্রিয়াটির স্টারডার স্ট্রিমটি অ্যাক্সেসযোগ্য নয় (উদাহরণস্বরূপ যে টার্মিনালটিতে এটি কার্যকর হয়েছিল তা ইতিমধ্যে বন্ধ ছিল)। এই ক্ষেত্রে, নিম্নলিখিত কাজগুলি করার জন্য একটি কাজ করা উচিত (ফ্রিবিএসডি-তে পরীক্ষা করা, লিনাক্সে কিছুটা আলাদা হতে পারে):

  1. ব্যবহার করুন iostatটার্গেট ডিভাইস, যেমন গড় লেখার হার (মেগাবাইট / সেকেন্ড) অনুমান করার জন্য:

    iostat -d -w30 ada0

    আপনার টার্গেট ডিভাইসের নামটি ada0এখানে রাখুন এবং এর জন্য কয়েকটি ফলাফল দেওয়ার জন্য এক মিনিট অপেক্ষা করুন। "W" পরামিতি নমুনার মধ্যে কত সেকেন্ড স্থির করে তা নির্ধারণ করে। এটি বাড়ানো কম বৈকল্পিকতার সাথে আরও ভাল গড় অনুমান দেয় তবে আপনাকে আরও অপেক্ষা করতে হবে।

  2. psকত দিন ddধরে চলছে তা নির্ধারণ করতে ব্যবহার করুন :

    ps -xo etime,command | grep dd

    রানটাইমের মোট সেকেন্ডে পেতে এটি সেকেন্ডে রূপান্তর করুন।

  3. মোট স্থানান্তরিত এমবি পেতে গড় রেকট রেট দ্বারা রানটাইমের মোট সেকেন্ডকে গুণান।
  4. এমবিতে ডিভাইসের আকারটি এতে পান:

    grep ada0 /var/run/dmesg.boot

    এর জন্য আপনার টার্গেট ডিভাইসের নাম প্রতিস্থাপন করুন ada0। সেকেন্ডে মোট স্থানান্তর সময় পেতে গড় লেখার হার দ্বারা ফলাফল ভাগ করুন। সময় বাকী থাকার জন্য এখন পর্যন্ত যে সময়টি চলছে তা বিয়োগ করুন।

এই কৌশলটি কেবল তখনই ddকার্যকর হয় যখন এটি শুরু হওয়ার পর থেকে বর্তমান গড় লেখার হারে ধারাবাহিকভাবে লিখতে থাকে। যদি অন্যান্য প্রক্রিয়াগুলি সিপিইউ বা আই / ও রিসোর্সের (আই / ও বাস সহ) প্রতিযোগিতা করে তবে তা স্থানান্তর হার হ্রাস করতে পারে।


4

আমি dcfldd (1) ব্যবহার করতে শুরু করেছি, যা ডিডি অপারেশনগুলি আরও ভাল উপায়ে দেখায়।


2

ddএক্সিকিউট করার সময় আমি এটি অন্য টার্মিনালে মূল হিসাবে চালাচ্ছি:

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

এটা তোলে ছাপে ddঅবস্থা যে 1 সেকেন্ড মূল টার্মিনাল উইন্ডোতে যেখানে ddনির্বাহ করা হয়, এবং যখন কমান্ড সম্পন্ন করা হয় শোধবোধ।


খুবই ভাল. এল ক্যাপ্টেনের অধীনে এখানে সূক্ষ্মভাবে কাজ করেছিলেন
স্টেফানো মাতাঙ্গু

2

আপনি ব্যবহার করতে পারেন progressযা বিশেষত দৌড়ের অগ্রগতি দেখায় dd। এটি ব্যবহার করে /proc/$pid/fdএবং /proc/$pid/fdinfo যা আপনি হাত দ্বারাও নিরীক্ষণ করতে পারেন।


1

wcharলাইন (লিখিত অক্ষর) মধ্যে /proc/$pid/ioআপনার সম্পর্কে সুনির্দিষ্ট তথ্য দিতে পারেন ddপ্রক্রিয়া। যতক্ষণ না এটি পরিবর্তন হয় ততক্ষণ আপনার ddকাজ চলছে!

এখানে একটি ঝরঝরে সামান্য পিএইচপি স্ক্রিপ্ট, আপনি সংরক্ষণ এবং তারপর সঙ্গে নির্বাহ করতে পারেন যা php filename.phpসময় ddলিখিত বাইট প্রদর্শন করে। /proc/$pid/ioওভার দেখার দুর্দান্ত সুবিধা kill -USR1 $(pidof dd)হ'ল আপনাকে টার্মিনালের মধ্যে স্যুইচ করতে হবে না, যা সর্বদা কোনও বিকল্প নয়।

<?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";
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.