プログラムのコマンドラインで信号を使用/送信する方法(例:dd)

プログラムのコマンドラインで信号を使用/送信する方法(例:dd)

私はdd次のプログラムのマンページを理解しようとしています。

実行中の「dd」プロセスにUSR1シグナルを送信し、I / O統計を標準エラーとして印刷してからレプリケーションを再開します。

         $ dd if=/dev/zero of=/dev/null& pid=$!
         $ kill -USR1 $pid; sleep 1; kill $pid

どういう意味ですかpid=$!

これは変数への割り当てですか? pidを取得しますかdd?最終的に$pid変数に使用されますか?

また、なぜ使用するsleepのですkillか?

使用方法は-USR1

ベストアンサー1

dd if=/dev/zero of=/dev/null&

末尾とは、&バックグラウンドで prefix コマンドを実行することを意味します。 (免責事項:これは過度に単純化された声明です)

引用するこれ:

$!最新のバックグラウンドコマンドのPID。

だからpid=$!割り当て最新の背景PIDPIDは変数pidにdd

そしてなぜ彼らは眠りに落ちて殺すのですか?

あなたはする必要がありますkill $pid (パラメータが指定されていない場合、killのデフォルト信号はTERMであり、これはプロセスが終了することを意味します。)ddテストが完了したら、プロセスを終了します。そうしないと、ddプロセスはバックグラウンドに残り、CPUリソースを消費する可能性があります。プラットフォームのシステムモニターを確認して確認してください。

I / O統計は印刷されますが、Kill -USR1 $pidプロセスは終了しません。

dd1秒待機しないと、プロセスが端末に統計出力を書き込む前に、最後のステートメントによってプロセスが終了する可能性があります。kill $pidこれらのプロセスは同期されますが、トラップ+書き込み操作( kill -USR1 $pid) は次より遅くなることがあります。ジョブ終了kill $pid)。したがって、2番目は、統計出力の印刷が完了したことを確認するためにsleep 1開始を遅らせることです。kill $pid

これが-USR1が使用される方法ですか?

のみman dd:

実行中の「dd」プロセスにUSR1シグナルを送信し、I / O統計を標準エラーとして印刷してからレプリケーションを再開します。

そしてman 7 signal

   SIGUSR1   30,10,16    Term    User-defined signal 1
   SIGUSR2   31,12,17    Term    User-defined signal 2

これら2つの文を組み合わせると、USR1が次のようになることを理解する必要があります。カスタム信号その定義は、ddユーザーにこれを中断する方法を提供することです。I/O 統計の印刷飛行中。これはプログラム固有のハンドラであり、kill -USR1 other_program_pid統計出力を期待できるという意味ではありません。

また、に興味がある可能性があります注:SIGUSR1がプロセスを終了するのはなぜですか?

おすすめ記事