特定のプロセスのPIDと状態を取得する方法

特定のプロセスのPIDと状態を取得する方法

1000からカウントダウンするデフォルトのシェルスクリプトを作成しました。これはテスト用ですが、すべてのアプリケーション/プロセスになることができます。

##filename:test.sh##

#!/bin/bash
i=1000; while [ $i -gt 0 ]; do echo $i; i=`expr $i - 1`; sleep 1; done

私は走り始めます:

sh test.sh

これで、次のようになります。a)スクリプトのpid、b)スクリプトの状態

もし私がするなら

pidof sh test.sh 

しかし、いくつかの結果が得られます。

走る

ps aux | grep test.sh 

いくつかの終了(ステータス= T)と1つのアイテムを含む複数のアイテムを受け取りました。必要な項目にgrep test.sh制限するにはどうすればよいですか(1つのインスタンスのみが実行されていると仮定します)。pidof

私にも国が必要です。私は実行しようとしています:

ps aux | grep test.sh | ps -o stat --no-headers

しかし、それはうまくいきませんでした。状態を取得しましたが、複数のプロジェクトについて

答え1

pidof -x test.shこれにより、PIDを取得するために必要な情報が提供されます。

マニュアルページでは、

-xスクリプト - プログラムが指定されたスクリプトを実行しているシェルのプロセスIDも返します。

これは私のテストです、

tony@trinity:~$ ls -l testit.sh
-rwxr-xr-x 1 tony tony 83 Jan  5 14:53 testit.sh
tony@trinity:~$ ./testit.sh
1000
999
998
997

同時に

tony@trinity:~$ ps -ef | grep testit.sh
tony      4233 20244  0 14:58 pts/5    00:00:00 /bin/bash ./testit.sh
tony      4295  3215  0 14:58 pts/6    00:00:00 grep --color=auto testit.sh

それから

tony@trinity:~$ pidof -x testit.sh
4233

その後、クエリは一般的な問題であり、1つの解決策は次のとおりです。

ps aux | grep test.sh | grep -v grep

これにより、行は1つだけ提供されます(test.sh一意であると仮定)。

最後に、最後のコマンドはPIDだけを渡すのではなく、全文行を渡します。これはpsPIDを取得する方法でもありません(PIDは後に続くと予想されます-p)。

例えば、

tony@trinity:~$ ps aux | grep testit.sh
tony      4233  0.1  0.0   4288  1276 pts/5    S+   14:58   0:00 /bin/bash ./testit.sh
tony      5728  0.0  0.0   3476   760 pts/6    S+   15:04   0:00 grep --color=auto testit.sh

したがって、grepを実行してからpidを返す必要があります。

tony@trinity:~$ ps aux | grep testit.sh | grep -v grep | awk '{print $2}'
4233

次に、

tony@trinity:~$ ps -o stat --no-headers -p $(ps aux | grep testit.sh | grep -v grep | awk '{print $2}')
S+

これを達成するためのあまり複雑な方法がたくさんあるかもしれませんが、私は進捗状況を見せたいと思いました。

関連情報