web-dev-qa-db-ja.com

停止中のジョブがあります(bash出口)

メッセージThere are stopped jobs.ときどきbashシェルを終了しようとすると。 python 2.xの再現可能なシナリオは次のとおりです。

  • ctrl+c 例外としてインタープリターによって処理されます。
  • ctrl+z プロセスを「停止」します。
  • ctrl+d exits python。

次に、実際の端末出力をいくつか示します。

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bashは終了しませんでした。bashシェルを終了するには、もう一度exitを実行する必要があります。

  • Q:「停止したジョブ」とは何ですか、またはこれはどういう意味ですか?
  • Q:停止したプロセスを再開できますか?
  • Q:最初のexitは停止したジョブを強制終了しますか?
  • Q:初めてシェルを終了する方法はありますか? (exitを2回入力せずに)
168
ThorSummoner

停止されたジョブとは、一時的にバックグラウンドに置かれ、もはや実行されていないが、まだリソース(つまり、システムメモリ)を使用しているジョブです。そのジョブは現在の端末にアタッチされていないため、出力を生成できず、ユーザーからの入力を受け取りません。

jobs組み込みコマンドを使用して、bashで実行しているジョブを確認できます。他のシェルも同様です。例:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

fg(フォアグラウンド)bash組み込みコマンドを使用して、停止したジョブを再開できます。停止されたコマンドが複数ある場合は、コマンドラインでfgを使用してjobspec番号を渡すことにより、再開するコマンドを指定する必要があります。 1つのプログラムだけが停止している場合は、fgを単独で使用できます。

user@mysystem:~$ fg 1
python

この時点で、pythonインタープリターに戻り、control-Dを使用して終了することができます。

逆に、jobspecまたはPIDを使用してコマンドをkillすることもできます。例えば:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Jobspecを使用するには、数値の前にパーセント(%)キーを付けます。

user@mysystem:~$ kill %1
[1]+  Terminated              python

ジョブを停止して終了コマンドを発行すると、表示された警告が表示されます。ジョブは安全のため実行されたままになります。これは、停止したことを忘れた可能性のあるジョブを強制終了しようとしていることを確認するためです。 2回目にexitコマンドを使用すると、ジョブが終了し、シェルが終了します。これは、この方法で強制終了することを意図していない一部のプログラムに問題を引き起こす可能性があります。

Bashでは、停止したプロセスを強制終了して終了するlogoutコマンドを使用できるようです。これにより、望ましくない結果が生じる可能性があります。

また、一部のプログラムは、この方法で終了すると終了しない場合があり、システムがそれを習慣とすると、リソースを使い果たして孤立したプロセスが多数発生する可能性があることに注意してください。

ユーザー入力が必要な場合に停止するバックグラウンドプロセスを作成できることに注意してください。

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Ctrl-z割り込みで停止したジョブと同じ方法で、これらのジョブを再開および強制終了できます。

221
OldTimer

Q:「停止したジョブ」とは何ですか、またはこれはどういう意味ですか?

停止したジョブとは、キーボードから停止信号(SIGSTOP/SIGTSTP)を受け取ったプロセスを意味します(中断文字 Ctrl-Z)、コマンド(例:_kill -STOP [PID]_)または別のプロセス(例:リソースが不足している場合のカーネル)であり、一時停止状態であるため、システムにプロセスを停止/一時停止して、実行しないように指示します/処理。

アクティブなシェルジョブは、jobsで一覧表示できます。

Q:停止したプロセスを再開できますか?

停止したプロセスは、SIGCONTシグナルが送信された場合にのみ実行を再開します。これは、ジョブをフォアグラウンドに移動して現在のジョブにするfg(または_fg ID_)、またはバックグラウンドで続行するbgのいずれか、またはSIGCONTシグナル(例_kill -CONT [PID]_)。

Q:最初の出口は停止したジョブを強制終了しますか?

初めてexit/logoutと入力するか、 Ctrl-D、シェルは、端末に関連付けられている現在アクティブなジョブに関する警告メッセージを出力します。そのため、アクションを2回目に確認しても、許可なくジョブを強制終了することはありません。 checkjobsオプションが有効になっている場合(_shopt -s checkjobs_)、ステータスとともにジョブを一覧表示することもできます。

Q:初めてシェルを終了する方法はありますか? (出口を2回入力することなく)

押すことができます Ctrl+D 2回またはそれ以上長く保持すると、シェルは静かに終了し、現在停止中または実行中のシェルジョブをすばやく強制終了します。

または、それらを破棄(disown)して、それらを残すか手動で強制終了します:kill $(jobs -p)

19
kenorb