もともとフォアグラウンドで実行されているプロセスがあります。によって中断されました Ctrl+Z、次にbg <jobid>
によってバックグラウンドでの実行を再開します。
バックグラウンドで実行されているプロセスを一時停止するにはどうすればよいですか?
バックグラウンドプロセスをフォアグラウンドにするにはどうすればよいですか?
編集:
プロセスはstderrに出力するので、プロセスが端末に出力しているときに、コマンドfg <jobid>
をどのように発行しますか?
Timが言ったように、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のプロセスにシグナルを送信する方法 および バックグラウンドジョブおよびフォアグラウンドジョブを管理する方法 。
これは、ジョブコントロールを備えたすべてのシェルに当てはまるはずです。これは、(ほとんどの場合)本当に古代のシェルを扱わない限り、当然と見なすことができます。 POSIX標準にある 、つまりdash
でもジョブ制御をサポートします(インタラクティブに実行する場合、または-m
で実行する場合)。
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
した場合と同じように、(フォアグラウンドで)その進行を再開します。
この質問を編集すると、標準エラーについて尋ねられます。
プロセスはstderrに出力するので、プロセスが端末に出力しているときに、コマンド
fg <jobid>
をどのように発行しますか?
問題のジョブにバックグラウンドのコンポーネントが含まれていない限り(またはジョブ全体が、おそらくkill -CONT
を介してバックグラウンドになっている場合)、中断されている間は実際に出力が表示されないはずです。
それがまだデータを出力している場合(標準出力であろうと標準エラーであろうと)、ターミナルは視覚的に乱雑になりますが、その出力はすべて入力の一部ではないため無視されます。これにより、タイプミスが入力されていないことがわかりにくくなる可能性がありますが、(盲目的に)fg
と入力しますEnter (複数のジョブがあり、問題のジョブが最新ではない場合を除き、十分なはずです。その場合、実際にはジョブ記述子が必要になります)。
ジョブ記述子を見つける必要がある場合は、別の端末を使用して、上記の非インタラクティブな方法でSTOP
信号を送信します。これにより、ディスプレイが解放されます(おそらくヒットします) Enter 数回またはclear
を実行するか Ctrl+L)したがって、jobs
を実行してジョブ記述子を検索し、fg %N
を実行できます。ここで、N
はその番号です。
fg
と入力して、フォアグラウンドに移動します。
jobs
コマンドでジョブを一覧表示するfg
;を使用して、ターゲットジョブをフォアグラウンドにします。例:fg %4
CTRL Z
中断するbg %4
プロセスを終了するには、いくつかの方法があります。多くの場合、コンソールベースのコマンドから、 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