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だけを渡すのではなく、全文行を渡します。これはps
PIDを取得する方法でもありません(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+
これを達成するためのあまり複雑な方法がたくさんあるかもしれませんが、私は進捗状況を見せたいと思いました。