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