Linuxシステムで実行中のプロセスを一時停止し、後で再開する方法はありますか?


37

マシン上のファイルをコピーする必要があります。また、データは膨大です。現在、サーバーは通常どおりに機能する必要があり、通常は特定の範囲の繁忙時間があります。サーバーが忙しい時間にヒットした場合、プロセスを一時停止し、その範囲外になったときに再開するように、そのようなコマンドを実行する方法はありますか?

意図した結果

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.

22
rsyncのは、部分的な転送を再開することができます
するThorbjörnRavnアンデルセン

2
実際のデータをバックアップとしてコピーする必要がありますか?そうでない場合cp -al、ハードリンクファームの作成に使用できますか?または、cp -a --reflink=auto?を使用して、コピーオンライトでブロックレベルのreflinksをサポートするファイルシステムを使用します BTRFSとZFSは、同じ物理デバイス内のコピーに対してサポートします。
ピーターコーデス

9
src9:00〜14:00の間に変更されているファイルはありますか?その場合、単にcpプロセスを一時停止して再開すると、ファイルが破損する可能性があります。コマンドrsyncと組み合わせて実行する方が良い場合がありますtimeout
マークプロトニック

ファイルはどこからコピーされますか?これは仮想システムですか?ソースファイルシステムとは何ですか?コピーの目的は何ですか?
Braiam

@Braiam Imはrsyncを使用し、リモートからローカルマシンにファイルをコピーします。私はちょうどところでここでは例として、cpコマンドを使用
Sollosa

回答:


7

はい、する必要があります

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

プロセスは、ステータス「T」(PS)で表示されます。続行するには

$> kill -CONT <pid>

がんばろう!


77

プロセスに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ファイル(使用する場合)を管理し、一時停止する前にコピーが実際に実行されていることを確認する必要があります。おそらく、コピーが完了したらpidfileを削除してクリーンアップする必要があります。

言い換えれば、信頼性を高めるためにこれをもっと必要としますが、これらのSIGSTOPシグナルとSIGCONTシグナルを使用してプロセスの実行を一時停止/再開するという基本的な考え方は、あなたが探しているもののようです。



1
「/var/run/bigcopy.pid」が、あなたが思っているのと同じプロセスをまだ参照していることに注意してください。システム上の他のプロセスをランダムに停止することは望ましくない場合があります。私はpidはあなたはそれがかかわらないと思うプログラムを参照していることを確保するためのノー安全な方法を知っている...
エヴァン・ベン

@EvanBennうん、それは「一時停止する前にコピーが実際に実行されていることを確認する」という意味での意味です。ええ、PIDのチェックは本質的に人種
差別的である

@cat実際には、プロセスはSIGSTOPをブロックできません。(あなたはそれが事実だ参照してくださいよ、またはそれをグーグル。)「SIGSTOPはSIGKILLのような非ブロック可能信号である」:最初のコメントからのリンクを参照してください
filbranden

76

プロセスを一時停止する代わりに、優先度を低くすることもできます。

renice 19 "$pid"

優先度が最低(最高の素晴らしさ)になるので、そのプロセスは、ほとんどの場合それを必要とする他のプロセスにCPUを譲ります。

Linuxでは、I / Oを使用して同じことができますionice

ionice -c idle -p "$pid"

定義された猶予期間中に他のプログラムがディスクI / Oを要求していない場合にのみディスク時間を取得するように、プロセスを「アイドル」クラスに配置します。


22
これはXY問題の典型的なケースです。問題はプロセスを一時停止する方法でしたが、これは質問に答えません。実際、優先順位を下げることは実際の問題に対するより良いアプローチですが、質問には答えません。私は考え、編集もプロセスを一時停止すると問題がある可能性があります一時停止理由(例えば、ファイルを一時停止しながら編集することができます)どのように含めるように質問を。
MechMK1

22
@DavidStockinger、技術的には、この回答は、OS(CPU、I / Oスケジューラー)がビジーなときにプロセスを一時停止するようにOSに指示する方法を示します(一度に数秒の場合でも)。プロセスを手動で一時停止する方法は、他の回答で既に説明されています。この解決策は、ファイルがコピーされている間に変更される問題に対処していません。
ステファンシャゼラス

5
I / O優先度を変更することが常に最適なソリューションとは限りません。回転しているディスクからコピーする場合、優先度の低い操作を完全に一時停止しても発生しない、優先度の高い各リクエストの前にシークが発生する可能性があります。
マーク

2
優先順位を下げても問題は解決しません。ボックスが数秒または数分間完全にアイドル状態であっても、ファイルシステムキャッシュからすべてを追い出す巨大なコピープロセスが目立たないという意味ではありません。すぐに負荷が再びありますようとして、で非常に遅いページングすべてのバックになるだろう。
R ...

2
@DavidStockingerのXY問題に対処する好ましい方法は、たとえ質問が求めているものではない場合でも、適切なソリューションを提供することです。質問で説明されているアプローチが間違っていることがわかっている場合、適切な答えはその間違ったアプローチではなく、より良いアプローチを提案します。
テルドン

8

このシナリオでは、rsyncを使用します。cpは忘れてください。帯域幅を制限するためのパラメータがあります。または、Google rsync example / sを残したまま、強制終了または停止して後で開始することができます。


3

実行中のプロセスを中断してこれを行う場合は、Screenプログラムで遊ぶことをお勧めします。私はしばらくLinuxを使用していませんが、IIRCはコマンドを一時停止して後で再開するだけで、非常に脆弱になります。誤ってログオフすると、セッションを再開できなくなります。

画面を使用すると、セッションを中断してから切り離してログアウトできると思います。後で戻ってそのセッションに再接続できます。少し試してみる必要がありますが、セッションがより堅牢になりました。

ログアウトして家に帰ってからリモートでログインし、オフィスで開始したシステムに再接続して夕方から再開し、翌日に再び仕事に出ることもできます。


私はすでにthaにtmuxを使用しています。しかし、私は自己認識型またはできれば環境対応型のスクリプトを書いているので、サーバーが高いトラフィックを取得すると停止し、正常な場合は続行します。
Sollosa

0

シェルがそれをサポートしている場合(ほぼすべて)、^ Z(Ctrl + Z)を押すSIGTSTPと、フォアグラウンドタスクに信号を簡単に送信し、fg(フォアグラウンドで)またはbg(バックグラウンドで)続行できます。

複数のタスクでこれを行い、後でそれらに戻りたい場合は、jobscommand を使用してからを返すことができますfg/bg %#。#はジョブのカッコ内の数字です。

それに注意してくださいSIGTSTPより少しの違いSIGSTOP、それは無視することができるという事実のために最も重要なのは、(他のすべての回答に使用されている)(しかし、私はプログラム以外のそれを無視表示されませんでしたsl)。詳細については、StackOverflowのこの回答をご覧ください。


答えがまだこれに言及していないことに驚いた。
アベニュー

タイアベニュー、私はこのマルチタスクのトリックを知っています。しかし、それを実現するには、ターミナル上にいる必要があります。一方、数日かかっても、それ自体でジョブを実行するスクリプトを作成する必要がありました。
Sollosa

@Sollosaは、同じ質問を持ち、端末にアクセスできる他の人に役立ちます。
アベニュー

同意する。Ave :)を知っている素敵な
Sollosa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.