ファイルをコンピュータにコピーする必要があります。そしてそのデータは非常に膨大です。現在、サーバーには通常のサービスが必要で、特定の忙しい時間帯があることがよくあります。もしそうなら、サーバーが忙しい時間に達したときにプロセスを一時停止し、範囲外で再起動するようにこのようなコマンドを実行する方法はありますか?
予想される結果
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
答え1
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ファイルを削除してクリーンアップする必要があります。
つまり、信頼できるようにするには、これを中心に構築するためにもっと必要がありますが、プロセスの実行を一時停止/再開するためにこれらの信号SIGSTOP
とSIGCONT
信号を使用する基本的なアイデアがあなたが探しているようです。
答え2
プロセスを一時停止するのではなく、優先順位を下げることができます。
renice 19 "$pid"
プロセスがほとんどの時間 CPU を必要とする他のプロセスに CPU を譲渡するように、最も低い優先順位 (最も高い優先順位) が与えられます。
Linuxでは、I / Oを使用して同じことを実行できますionice
。
ionice -c idle -p "$pid"
プロセスを「アイドル」クラスに入れて定義された猶予期間内に他のプログラムがディスクI / Oを要求しない場合にのみ、ディスク時間を取得します。。
答え3
はい、中断したいプロセスのプロセスIDを取得する必要があります(コマンドを介してps
)。次に、次の操作を行います。
$> kill -SIGSTOP <pid>
これにより、プロセスはステータス「T」(in ps
)を表示します。
続行するには:
$> kill -CONT <pid>
答え4
実行中のプロセスを中断してこれを行う場合は、Screenプログラムを使用することをお勧めします。しばらくLinuxを使用していませんが、IIRCがコマンドを一時停止してから後で再起動すると脆弱になり、誤ってログアウトするとセッションを再開できなくなります。
screenを使用すると、セッションを中断してからセッションを切断してログアウトできると思います。後でセッションに戻って再接続できます。試してみる必要がありますが、セッションははるかに強力になります。
ログオフして家に帰り、リモートでログインしてオフィスで起動したシステムに再接続し、夕方に再起動し、翌日の職場で再利用することもできます。