web-dev-qa-db-ja.com

bashですべてのバックグラウンドpidを一覧表示する方法

検索を正しく表現できないか、答えを見つけるのが簡単ではありません!しかし、すべてのバックグラウンドタスクPIDを一覧表示する方法を見つけようとしています。例えば:

これまでのところ、使用する最後のPIDを一覧表示することがわかりました。

$!

しかし、その前のタスクのPID(存在する場合)をリストしたいのですが、その方法が見つかりません。最終的に、すべてのバックグラウンドタスクPIDを一覧表示したいと思います。

最後のジョブIDも次のように見つけることができます。

%% (last job in list)
%1 (first job in list)
%2 (second job in list)

しかし、同じことがプロセスIDでは機能しないようですか?

皆さんありがとう :)

14
code_fodder

ps Sを使用します。例えば:

$ vim &
[1] 8263
$ ipython &
[2] 8264
$ ps S
 PID TTY      STAT   TIME COMMAND
 3082 pts/0    Ss     0:00 bash
 3137 pts/0    Sl+    0:00 python /usr/bin/ipython
 8207 pts/2    Ss     0:00 bash
 8263 pts/2    T      0:00 vim
 8264 pts/2    Tl     0:00 python /usr/bin/ipython
 8284 pts/2    Tl     0:00 python /usr/bin/ipython
 8355 pts/2    R+     0:00 ps S

PIDを取得したい場合は、以下を使用してください。

$ ps S | awk '{print  $  1 }' | grep -E '[0-9]'
3082
3137
8207
8263
8264
8284
8357
8358
835

また、jobs -lを使用することもできますが、現在のセッションのバックグラウンドプロセスのみが表示されます。

18

しかし、同じことがプロセスIDでは機能しないようですか?

あなたが試すことができます jobs -lまたは-p-lおよび-pスイッチにより、jobsコマンドはプロセスIDも出力します。

7
cnicutar

Bashでは、tcshと同様に、おそらく必要なコマンドはjobs -l(Longの場合)です。

[ghoti@pc ~]$ sleep 300 &
[1] 33811
[ghoti@pc ~]$ sleep 301 &
[2] 33812
[ghoti@pc ~]$ sleep 302 &
[3] 33813
[ghoti@pc ~]$ jobs -l
[1]- 33811 Running                 sleep 300 &
[2]- 33812 Running                 sleep 301 &
[3]+ 33813 Running                 sleep 302 &
[ghoti@pc ~]$ 
2
ghoti

シェルによってジョブとして処理されなくなった子プロセスも確認したい場合(たとえば、意図的にdisownしたなどの理由で)、これを使用して、次のようなすべてのプロセスを見つけることができます。 あなた親として:

grep "PPid:.*$$" /proc/[0-9]*/status | cut -d/ -f3

また

ps --ppid $$

役に立つことができます。 (ここにも回答がある@Michael Kazarianへのクレジット。)

1
Alfe