停止されたジョブがあります(bash出口で)


158

There are stopped jobs.時々bashシェルを終了しようとすると、メッセージが表示されます。Python 2.xの再現可能なシナリオを次に示します。

  • ctrl+ cは、インタープリターによって例外として処理されます。
  • ctrl+ zプロセスを「停止」します。
  • ctrl+ d実数で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が終了しませんでしexitた。bashシェルを終了するには、もう一度する必要があります。

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

ctrl + shift + \もpythonを終了します。
ThorSummoner 14

回答:


206

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

jobsbash の組み込みコマンドを使用して、実行中のジョブを確認できます。おそらく他のシェルも同様です。例:

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

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

user@mysystem:~$ fg 1
python

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

逆に、killjobspecまたはPIDのいずれかでコマンドを実行できます。例えば:

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

停止したジョブでexitコマンドを発行すると、見た警告が表示されます。ジョブは安全のために実行されたままになります。それは、あなたがあなたがあなたが止めたのを忘れているかもしれない仕事を殺そうとしていることをあなたが知っていることを確実にするためです。exitコマンドを2回使用すると、ジョブが終了し、シェルが終了します。これにより、この方法で強制終了されることを意図していないプログラムで問題が発生する場合があります。

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

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

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

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

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


4
私はあなたの2番目の文にしています。それは「仕事がされているので、言うべき停止し、それが取ることができない任意のアクションを。 -ファイルI / O、ネットワークI / O、ターミナルI / O、またはその他の処理」
スコット・

2
これは非常に役立ちます。
シェルビー

どなたにも素晴らしいヘルプを投稿してください!
ジョージウドセン

18

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:初めてシェルを終了する方法はありますか?(exitを2回入力しないで)

Ctrl+D2回押すか、長く押し続けると、シェルが静かになり、現在停止中または実行中のシェルジョブがすぐに終了します。

または、それらを放棄する(disown)か、手動で削除するか、手動で削除しますkill $(jobs -p)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.