最初は、フォアグラウンドで実行されるプロセスがあります。Ctrl+を押してZ一時停止し、再起動してバックグラウンドで実行しますbg <jobid>
。
バックグラウンドで実行されているプロセスを一時停止する方法を知りたいです。
バックグラウンドプロセスをフォアグラウンドにインポートする方法は?
編集する:
fg <jobid>
プロセスはstderrに出力されますが、プロセスが端末に出力するときにどのようにコマンドを実行しますか?
答え1
Timが言ったように、fg
この最後のプロセスを前景に戻すには入力してください。
バックグラウンドで複数のプロセスが実行されている場合は、次の手順を実行します。
$ jobs
[1] Stopped vim
[2]- Stopped bash
[3]+ Stopped vim 23
fg %3
vim 23
プロセスを前景に戻します。
バックグラウンドで実行されているプロセスを一時停止するには、次を使用します。
kill -STOP %job_id
CtrlSIGSTOP信号は、基本的に+と同じ方法でプロセスを停止(一時停止)しますZ。
例: kill -STOP %3
。
源泉:
答え2
これは、ジョブ制御機能を備えたすべてのシェルに当てはまります。 POSIX規格に準拠しています。したがって、dash
ジョブ制御もサポートされています(対話式で実行するか、を使用して実行する場合-m
)。
インタラクティブ
- Ctrl+z現在のフォアグラウンドプログラムを一時停止します。
bg
最近一時停止されたプログラムをバックグラウンドに切り替える
(bg %2
ジョブ番号とともに使用、確認可能jobs
)fg
最近一時停止されたプログラムをフォアグラウンドにインポートする
では、他の+を介してプロンプトで暗黙的に実行されるようにzsh
キーバインディングを作成できます。fg
Ctrlz
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
停止中に暗黙的に実行する賢い方法があるかもしれませんが、bg
少なくとも私にとっては合理的ではないようです。私はCtrl主に+が中断されないzのでCtrl、+を使いたいです。確かに基本的に殺したくない! (このロジックは、私がもはやこのキーバインディングを使用していない理由にも当てはまります。ckill %1
bg
Ctrlz
非対話型
他のシェルインスタンス(または時にはコマンドを含む他のユーザー)にいる場合は、ジョブsudo
番号を使用できないことがあります。
他のプロセスのプロセスID(PID)がわかったら、作業を続けることができます。を使用するpgrep …
か、PIDを取得します。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
+('dではなく)で停止したプログラムへのシグナルは、CONT
ユーザーが行ったように(フォアグラウンドで)進行を再開します。Ctrlzbg
fg
返信:標準エラー
この質問の編集者は標準エラーについて質問しました。
fg <jobid>
プロセスはstderrに出力されますが、プロセスが端末に出力するときにどのようにコマンドを実行しますか?
問題のタスクにバックグラウンドコンポーネントがない限り(またはタスク全体がバックグラウンドを通過できる場合kill -CONT
)、一時停止中に出力を実際に表示しないでください。
それでもデータを出力すると(標準出力または標準エラーで)、端末は視覚的に複雑になります。ただし、すべての出力は入力の一部ではないため無視されます。これにより、タイプミスを入力しなかったことがわかりにくくなりますが、(盲目的に)入力するだけでfg
Enter十分です(タスクが複数あり、関連タスクが最新でない場合)。職務説明記号)。
作業記述子を本当に見つける必要がある場合は、他の端末を使用してSTOP
上記の非対話型の方法で信号を送信してください。その後、タスク記述子を見つけるために実行し、数字がある場所で実行できるようにディスプレイを取得する必要があります(Enter数回クリックまたは実行clear
またはCtrl+ L)。jobs
fg %N
N
答え3
入力fg
して前景にインポートします。
答え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
。プロセスが通常のコマンドを無視する場合は、次のようにプロセスIDの後にkill
コマンドを使用できます。kill -9
$kill -9 6738
Terminated