質問: バックグラウンドプロセスを一時停止してフォアグラウンドにする方法 もともとフォアグラウンドで実行されているプロセスがあります。によって中断されました ctrl+z、次にbg <jobid>によってバックグラウンドでの実行を再開します。バックグラウンドで実行されているプロセスを一時停止するにはどうすればよいですか?バックグラウンドプロセスをフォアグラウンドにするにはどうすればよいですか?編集:プロセスはstderrに出力するので、プロセスが端末に出力しているときに、コマンドfg <jobid>をどのように発行しますか?
回答: これは、ジョブコントロールを備えたすべてのシェルに当てはまるはずです。これは、(ほとんどの場合)本当に古代のシェルを扱わない限り、当然と見なすことができます。 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はその番号です。