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

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

最初は、フォアグラウンドで実行されるプロセスがあります。Ctrl+を押してZ一時停止し、再起動してバックグラウンドで実行しますbg <jobid>

バックグラウンドで実行されているプロセスを一時停止する方法を知りたいです。

バックグラウンドプロセスをフォアグラウンドにインポートする方法は?

編集する:

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

答え1

Timが言ったように、fgこの最後のプロセスを前景に戻すには入力してください。

バックグラウンドで複数のプロセスが実行されている場合は、次の手順を実行します。

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

fg %3vim 23プロセスを前景に戻します。

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

kill -STOP %job_id

CtrlSIGSTOP信号は、基本的に+と同じ方法でプロセスを停止(一時停止)しますZ

例: kill -STOP %3

源泉:

答え2

これは、ジョブ制御機能を備えたすべてのシェルに当てはまります。 POSIX規格に準拠しています。したがって、dashジョブ制御もサポートされています(対話式で実行するか、を使用して実行する場合-m)。

インタラクティブ

  • Ctrl+z現在のフォアグラウンドプログラムを一時停止します。
  • bg最近一時停止されたプログラムをバックグラウンドに切り替える
    bg %2ジョブ番号とともに使用、確認可能jobs
  • fg最近一時停止されたプログラムをフォアグラウンドにインポートする

では、他の+を介してプロンプトで暗黙的に実行されるようにzshキーバインディングを作成できます。fgCtrlz

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

停止中に暗黙的に実行する賢い方法があるかもしれませんが、bg少なくとも私にとっては合理的ではないようです。私はCtrl主に+が中断されないzのでCtrl、+を使いたいです。確かに基本的に殺したくない! (このロジックは、私がもはやこのキーバインディングを使用していない理由にも当てはまります。ckill %1bgCtrlz

非対話型

他のシェルインスタンス(または時にはコマンドを含む他のユーザー)にいる場合は、ジョブ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ユーザーが行ったように(フォアグラウンドで)進行を再開します。Ctrlzbgfg

返信:標準エラー

この質問の編集者は標準エラーについて質問しました。

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

問題のタスクにバックグラウンドコンポーネントがない限り(またはタスク全体がバックグラウンドを通過できる場合kill -CONT)、一時停止中に出力を実際に表示しないでください。

それでもデータを出力すると(標準出力または標準エラーで)、端末は視覚的に複雑になります。ただし、すべての出力は入力の一部ではないため無視されます。これにより、タイプミスを入力しなかったことがわかりにくくなりますが、(盲目的に)入力するだけでfgEnter十分です(タスクが複数あり、関連タスクが最新でない場合)。職務説明記号)。

作業記述子を本当に見つける必要がある場合は、他の端末を使用してSTOP上記の非対話型の方法で信号を送信してください。その後、タスク記述子を見つけるために実行し、数字がある場所で実行できるようにディスプレイを取得する必要があります(Enter数回クリックまたは実行clearまたはCtrl+ L)。jobsfg %NN

答え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

関連情報