バックグラウンドプロセスを一時停止してフォアグラウンドにする方法


167

元々フォアグラウンドで実行されているプロセスがあります。Ctrl+ Zで中断し、バックグラウンドで実行を再開しbg <jobid>ます。

バックグラウンドで実行中のプロセスをどのように一時停止するのでしょうか?

バックグラウンドプロセスをフォアグラウンドにするにはどうすればよいですか?

編集:

プロセスはstderrに出力するのでfg <jobid>、プロセスが端末に出力している間にどのようにコマンドを発行する必要がありますか?


1
エラーを吐き出している端末でもコマンドを入力できます。STDERRに吐き出されたテキストは入力としてカウントされず、送信したキーのみがカウントされます。画面上では分かりにくいように見えますが、機能します。
カレブ

@Caleb:プロセスがstdoutに出力する場合でも、入力fg <jobid>して前景にすることができますか?
ティム

@Tim:はい、できます。
カレブ

回答:


216

ティムが言っfgたように、最後のプロセスを最前面に戻すために入力します。

バックグラウンドで複数のプロセスが実行されている場合は、次を実行します。

$ jobs
[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3持参するvim 23フォアグラウンドに戻すプロセスを。

バックグラウンドで実行中のプロセスを一時停止するには、次を使用します。

kill -STOP %job_id

SIGSTOPシグナルは、本質的にCtrl+ と同じ方法でプロセスを停止(一時停止)Zします。

例:kill -STOP %3

ソース:LinuxやUnixにおけるプロセスにシグナルを送信する方法背景と前景のジョブを管理する方法


23
信号19はSIGCONT私のためです。私が使用kill -STOPしてkill -CONT、とにかく数字を覚えるに優先して、しかし、あなたは確認することができkill -l、数値の自分を思い出させるために
無駄

プロセスはstderrに出力するので、コマンドjobをどのように発行fg <jobid>する必要がありますか。また、プロセスは端末に出力しますか?
ティム

1
@Tim通常どおりにコマンドを入力します。ジョブがバックグラウンドである限り、入力内容を読み取っていません-シェルです。あなたがタイプしたものはあなたにばらばらに見えるかもしれませんが、シェルはそれをうまく理解します。
AlexWebr

@AlexWebr:ありがとう、機能します!(1)バックグラウンドジョブは、「Ctrl + Z」などを含む入力および出力を受け入れませんか?(2)バックグラウンドで実行中のジョブを直接中断できますか?はいの場合、どのように?いいえの場合、中断する前にフォアグラウンドで実行するように最初に変更する必要がありますか?
ティム

2
バックグラウンドで実行中のジョブを直接中断できますか yes kill -STOP %job_id
:、

31

これは、ジョブ制御を備えたシェルのすべてに当てはまります。ジョブ制御は、(ほとんどの場合)本当に古代のシェルを処理しない限り、当然のことと見なすことができます。 これはPOSIX標準に含まれてdashいるため、ジョブ制御をサポートすることもできます(対話式またはで実行する場合-m)。

対話方式

  • Ctrl+ zは、現在フォアグラウンドになっているプログラムを一時停止します
  • bg最後に中断されたプログラムをバックグラウンドにし
    ます(bg %2ジョブ番号と共に使用します。ジョブ番号はで確認できますjobs
  • fg 最近中断されたプログラムをフォアグラウンドにします

ではzshfg別のCtrl+ を介してプロンプトから暗黙的に実行するキーバインディングを記述できますz

_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg

おそらくbgサスペンド時に暗黙的に実行する巧妙な方法もありますが、賢明ではないようです。少なくとも私にとっては、Ctrl+のz使用の大部分はCtrl+ cが抜け出せないためです。私はそれに続いて、例えばkill %1ではなく、たとえばbg、デフォルトで殺すことを望まない!(このロジックは、このキーバインドを使用しなくなった理由にも拡張されます。プロセスを停止するためにCtrl+ zを叩いている場合、最後にやりたいことは再開です!)

非インタラクティブ

別のシェルインスタンス(またはsudoコマンドを含むこともある別のユーザー)を使用している場合、ジョブ番号を使用できない可能性があります。

プロセスID(PID)がわかれば、別のプロセスを実行できます。PIDはpgrep …、またはps aux |grep …(または同じシェル、、jobs -lまたは$!)で取得でき、実行できます:

kill -STOP $PID  # suspend
kill -CONT $PID  # continue (resume)

プロセスIDがわからず、名前でプロセスの他のインスタンスを一時停止することを心配していない場合は、次のいずれかにシグナルを渡すことができます。

killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args

+でCONT停止した('d ではない)プログラムへのシグナルは、あなたが行った場合と同じように(フォアグラウンドで)進行を再開します。Ctrlzbgfg

再:標準エラー

この質問の編集は標準エラーについて尋ねます:

プロセスはstderrに出力するのでfg <jobid>、プロセスが端末に出力している間にどのようにコマンドを発行する必要がありますか?

問題のジョブにバックグラウンド化されたコンポーネントがある場合(または、おそらくを介してジョブ全体がバックグラウンド化されている場合)を除きkill -CONT、中断中の出力は実際には表示されません。

まだデータを出力している場合(標準出力または標準エラー)、端末は視覚的に混乱しますが、入力の一部ではないため、その出力はすべて無視されます。これにより、タイプミスを入力していないことがわかりにくくなる可能性がありますが、(盲目的に)入力fgEnterで十分です(複数のジョブがあり、問題のジョブが最新でない場合は、実際にはジョブ記述子が必要になります) )。

ジョブ記述子を見つける必要がある場合は、別の端末を使用して、STOP上記の非インタラクティブな方法で信号を送信してください。これにより、ディスプレイが解放され(おそらくEnter数回ヒットするか、実行されるclearCtrl+ L)、その後、実行jobsしてジョブ記述子を見つけ、その番号のfg %N場所で実行できますN


プロセスの一時停止と再開に関する唯一の問題は、他のプログラム(たとえばRabbitMQなど)に接続すると、再開時に接続が失われることです。
ナビゲーション

@Nav –ヘッドレスで実行しなかったからです。bashとzshでは、単にバックグラウンドプロセスを否認する必要があると思います。nohupまたはscreentmuxのような端末マルチプレクサーでこのようなタスクを実行することを好みます。nohupプロセスをピックアップすることはできません(別の接続からバックグラウンドプロセスを再開できないのと同じように)が、マルチプレクサに接続することはできます。
アダムカッツ

これはバックグラウンドプロセスでした。ターミナルを閉じてから、別のターミナルからサーバーにログインしました。
ナビゲーション

ええ、それを念頭に置いて起動しない限り、別のシェルからプロセスを再開することはできません。そのためにはscreenまたはtmuxをお勧めします。
アダムカッツ

CONTCtrl + Zで停止したプロセス(ジョブ/パイプライン)にシグナルを送信すると、たとえそれを実行していなくても、バックグラウンドで再開すると考えていますbg
Gマン

10

入力fgして前景に持ってきます。


ありがとう!プロセスはstderrに出力するのでfg <jobid>、プロセスが端末に出力している間にどのようにコマンドを発行する必要がありますか?
ティム

1
  1. jobsコマンドを使用してジョブを一覧表示する
  2. を使用して、ターゲットジョブをフォアグラウンドに移動しfgます。例えば: fg %4
  3. CTRL Z中断してヒット
  4. バックグラウンドで実行を開始するには、bgを使用します。例えば:bg %4

0

プロセスの終了は、いくつかの異なる方法で実行できます。多くの場合、コンソールベースのコマンドからCtrlcキーストローク(デフォルトの割り込み文字)を送信すると、コマンドが終了します。これは、プロセスがフォアグラウンドモードで実行されている場合に機能します。

プロセスがバックグラウンドモードで実行されている場合、まずpsコマンドを使用してジョブIDを取得する必要があります。その後、次のようにkillコマンドを使用してプロセスを強制終了できます。

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

ここで、killコマンドはfirst_oneプロセスを終了します。プロセスが通常のkillコマンドを無視する場合は、kill -9次のようにプロセスIDを続けて使用できます。

$kill -9 6738
Terminated

1
これは事実ですが、それは質問に答えていない...
jasonwryan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.