0

これを解決するためにgrepを使用してあらゆる種類のフィルターを試しましたが、クラックできません。

cpumem="$(ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}'

プロセスの CPU とメモリの使用量を抽出しています。コマンド ラインから実行すると、2 つのフィールドが正しく出力されます。

ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}'
> 1.1 4.4

しかし、bash スクリプト内から同じコマンドを実行すると、次のようになります。

cpumem="$(ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}')"
echo -e cpumem
> 1.1 4.40.0 0.10.0 0.0

3つのレコードをピックアップしていると推測していますが、どこからかわかりません.

grep -v 'grep' を使用して他の grep プロセスを除外しています。誰か提案やより信頼できる方法を提供できますか??

4

3 に答える 3

0

実際には、出力表示を簡単に修正できます。echoステートメントでは、変数を二重引用符で囲みます。

echo -e "$cpumem"

二重引用符を使用しないと、改行を単一スペース (または空の値) に変換しても保持されません。引用符を使用すると、出力時に変数の元のテキストが保持されます。

出力に複数のプロセス (つまり、複数の行) が含まれている場合、それはgrep実際に複数の行が一致したことを意味します。firefox-binプラグイン/コンテナの子プロセスが実行されている可能性がありますか? ではps aux11th列は実際のプロセスが何であるかを示すためawk、次のように更新できます (デバッグ用)。

awk '{printf $3 "\t" $4 "\t" $11}'
于 2012-08-27T06:02:50.077 に答える
0

問題を再現することはできませんでしたが、デバッグを支援するために、awk コマンドで print $11 を試してみてください。これにより、どのプロセスについて話しているかがわかります。

cpumem="$(ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4 "\t" $11 "\n"}')" echo -e cpumem

于 2012-08-27T05:47:19.673 に答える
0

3 つの firefox が実行されているため (または 1 つが実行されていて、それ自体がスレッド化されているため)、3 つのレコードがある可能性があります。

psプロセスを選択するオプションを指定することで、grep ハズルを回避できます。たとえば、-Cプロセスを名前で選択します。これps -C firefox-binで、Firefox プロセスのみが得られます。しかし、複数のプロセスがある場合、これはまったく役に立ちません。

( ps オプションを使用して、必要な列のみを出力することもできるため、行は次のようになります

ps -C less --no-headers -o %cpu,%mem

)。

トリプル レコードの場合、解決策を考え出す必要があります。スレッド化されているプログラムを使用するマルチユーザー環境では、同じ種類のプロセスが複数ある状況が常に発生する可能性があります。あなたが言わないように、誰もあなたを助けることができない多くの可能な解決策があります。1 人のユーザーからのみ選択し、pid が最も低いユーザー、またはグループの場合はプロセス リーダーのみを選択して、囲んでいる bash-script を変更してループを使用して複数の値を処理する、またはそれを作成するなどのソリューションを考えることができます。 ps が複数の結果を返す場合、動作が多少異なります。

于 2012-08-27T05:46:16.843 に答える