web-dev-qa-db-ja.com

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

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

バックグラウンドで実行されているプロセスを一時停止するにはどうすればよいですか?

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

編集:

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

185
Tim

Timが言ったように、fgと入力して、最後のプロセスをフォアグラウンドに戻します。

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

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

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

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

kill -STOP %job_id

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

例:kill -STOP %3

ソース: LinuxおよびUnixのプロセスにシグナルを送信する方法 および バックグラウンドジョブおよびフォアグラウンドジョブを管理する方法

237
fromnaboo

これは、ジョブコントロールを備えたすべてのシェルに当てはまるはずです。これは、(ほとんどの場合)本当に古代のシェルを扱わない限り、当然と見なすことができます。 POSIX標準にある 、つまりdashでもジョブ制御をサポートします(インタラクティブに実行する場合、または-mで実行する場合)。

インタラクティブ

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

zshでは、プロンプトから別の経由でfgを暗黙的に実行するキーバインディングを記述できます。 Ctrl+z

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

サスペンド時に暗黙的にbgを実行する賢い方法もあるでしょうが、賢明ではありません。少なくとも私にとって、私の大多数 Ctrl+z 使用法は Ctrl+c 脱出に失敗しています。私はそれに続きたいです。 bgではなくkill %1、そして私は確かにデフォルトで殺害したくありません! (このロジックは、このキーバインディングを使用しなくなった理由にも拡張されます。 Ctrl+z プロセスを停止するために、最後に実行したいのは再開です!)

非インタラクティブ

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

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

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シグナル Ctrl+z (そしてbg 'dではない)は、あなたがそれをfgした場合と同じように、(フォアグラウンドで)その進行を再開します。

Re:標準エラー

この質問を編集すると、標準エラーについて尋ねられます。

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

問題のジョブにバックグラウンドのコンポーネントが含まれていない限り(またはジョブ全体が、おそらくkill -CONTを介してバックグラウンドになっている場合)、中断されている間は実際に出力が表示されないはずです。

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

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

36
Adam Katz

fgと入力して、フォアグラウンドに移動します。

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

プロセスを終了するには、いくつかの方法があります。多くの場合、コンソールベースのコマンドから、 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
0
Lakshmi