マシンにファイルをコピーする必要があります。そして、データは非常に大きいです。現在、サーバーは通常どおりサービスを提供する必要があり、通常は特定の範囲の忙しい時間帯があります。それで、サーバーが忙しい時間に達した場合にプロセスを一時停止し、その範囲外になると再開するように、そのようなコマンドを実行する方法はありますか?
意図した結果
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
はい、一時停止するプロセスのプロセスIDを取得する必要があります(ps
コマンドを使用して)、次のようにします。
$> kill -SIGSTOP <pid>
その後、プロセスはステータス "T"(ps
内)で表示されます。
続行するには、次の操作を行います。
$> kill -CONT <pid>
SIGSTOPシグナルを送信してプロセスの実行を一時停止し、SIGCONTを送信して後で再開できます。
ワークロードが単一のプロセス(バックグラウンドで実行されているヘルパーをフォークしない)であると想定すると、次のようなものを使用できます。
# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid
次に、忙しい時間が始まったら、SIGSTOPを送信します。
# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"
後で、サーバーが再びアイドル状態になったときに再開します。
# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"
これを実行する特定の時間にこれをスケジュールする必要があります。これをスケジュールするには、cronやsystemdタイマーなどのツール(または他のさまざまな同様のツール)を使用できます。時間間隔に基づいてスケジュールを設定する代わりに、サーバーを監視して(おそらく、サーバーログから平均負荷、CPU使用率またはアクティビティを確認して)、いつコピーを一時停止/再開するかを決定できます。
また、PIDファイルを使用する場合は、PIDファイルを管理する必要があります。一時停止する前に、コピーが実際に実行されていることを確認してください。おそらく、コピーが完了したら、pidfileを削除してクリーンアップする必要があります。
言い換えると、信頼性を高めるためにこれについてもっと多くのことが必要ですが、これらのSIGSTOPおよびSIGCONTシグナルを使用してプロセスの実行を一時停止/再開するという基本的な考え方は、あなたが探しているもののようです。
プロセスを一時停止する代わりに、優先度を低くすることもできます。
renice 19 "$pid"
これにより、優先順位が最も低くなります(快適度が最も高くなります)。そのため、そのプロセスは、ほとんどの場合それを必要とする他のプロセスにCPUを譲ります。
Linuxでは、ionice
を使用したI/Oでも同じことができます。
ionice -c idle -p "$pid"
プロセスを「アイドル」クラスに入れ、それによって他のプログラムが定義された猶予期間の間ディスクI/Oを要求しなかった場合にのみディスク時間を取得します。
このシナリオでは、rsyncを使用し、cpを忘れます。帯域幅を制限するためのパラメータがあります。または、Google rsyncの例を残して、続行する方法で強制終了/停止して後で開始できます。
実行中のプロセスを中断して実行する場合は、Screenプログラムを使用することをお勧めします。私はしばらくLinuxを使用していませんが、IIRCはコマンドを一時停止して後で再開するだけでかなり脆弱です。誤ってログオフすると、セッションを再開できなくなります。
画面があれば、セッションを中断してから切り離してログアウトできると思います。後で戻って、そのセッションに再接続できます。少し遊んでみる必要がありますが、セッションがはるかに堅牢になりました。
また、ログアウトして家に帰ってからリモートでログインし、オフィスで開始したシステムに再接続して夕方から再開し、翌日の職場に持ち帰ることもできます。
シェルがそれをサポートしている場合(ほとんどすべての場合)、^ Z(Ctrl + Z)を押してSIGTSTP
信号をフォアグラウンドタスクに簡単に送信し、fg
(フォアグラウンドで)を続行できます。 )またはbg
(バックグラウンド)。
複数のタスクでこれを行い、後でそれらに戻りたい場合は、jobs
コマンドを使用してfg/bg %#
で戻ることができます。ここで、#はジョブの括弧内に与えられた番号です。
SIGTSTP
はSIGSTOP
(他のすべての回答で使用されます)とは少し異なることに注意してください。最も重要なのは、無視できるという事実です(ただし、プログラムはsl
以外は無視します)。詳細は StackOverflowのこの回答 を参照してください。