1

私自身はソフトウェア/スクリプトの専門家ではないので、ここで何が起こっているのか理解するのに苦労しています:

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss= | awk '{ i += $1 } END { print i }''

基本的に、snmp デーモンの Resident Set Size 値を 1 秒間に 5 回出力したいと考えています (公正な解決のため)。次に、これから構築して、後で分析するために出力をテキスト ファイルにリダイレクトし、そこでデータをたとえばグラフに入れるつもりです。

ここでの問題は、次のようにうまく実行できることです。

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss'

ただし、数値のみが必要なので、awkを使用してすべてを削除しますが、その値は重要です。

上記の最初のコマンドを実行するとエラーが返され、watchが一重引用符を処理する方法が原因であると思われますが、私はそれを理解するほど賢くありません....

助言がありますか?

また、私はそれを読みました

pmap -x [pid]

も機能しますが、 snmpd のそれぞれの PIDを使用して実行すると、明らかにそうでない場合に出力がゼロになります。これについても何かアイデアはありますか?

よろしく。

4

1 に答える 1

1

引用されたコマンドが正確である場合:

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss= | awk '{ i += $1 } END { print i }''
             ^                ^ ^                         ^                           ^^
             1                0 1                         0                           10

一重引用符に問題があります。1 は「引用の開始」を示し、0 は引用の終了を示します。次のコマンドラインが機能するはずです。

watch -n 0.2 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk "{ i += $1 } END { print i }"'
             ^                                                                         ^
             1                                                                         0

二重引用符$(...)も正しく機能します。一重引用符で囲まれた文字列watch全体が に送信されます。以前は、複数の引数がありました。

作業コマンドには、次のものがあることに注意してください。

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss'
             ^                ^ ^                 ^
             1                0 1                 0

ここで、真ん中の '01' の間の文字は空白ではなくカンマであるため、シェルは引き続きwatch単一の引数を与えますが、引用符は含まれません。watch3 番目の引数として取得されるのは次のとおりです。

ps -p $(pgrep -d, -xsnmpd) -o rss

-line を使用するawkと、 1watch` は複数の引数を取得します。

ps -p $(pgrep -d, -x snmpd) -o rss= | awk {
i
+=
$1
}
END
{
print
i
}

そして、それは過剰をどうするかを知りません。(注意: の値は$1シェルの現在の値になります$1(空の文字列の可能性があります。その場合、に対応する引数は$1省略されます。)


$1スクリプトのの前にバックスラッシュが付いたこのバリアントは、awk私にとってはうまくいくように見えました (実際に実行されているプログラムを探したsnmpdところ、テストしたマシンでは実行されていなかったので、うまくいきませんでした)。

sh -c 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk "{ i += \$1 } END { print i }"'

プロセスがない危険性があると思われる場合はsnmpd、もう少しコンパクトに処理する必要があります。それが私がテストしたコマンドです。watch -n 0.2の代わりに を配置できますsh -c。ただし、のマニュアルページにwatchは次のように明示的に記載されていることに注意してください。

commandが " " に指定されていることに注意してくださいsh -c。これは、目的の効果を得るために余分な引用符を使用する必要がある場合があることを意味します。

それは非常に正確でした!

一重引用符を使用したい場合は、次を試してください。

watch -n 0.2 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk '\''{ i += $1 } END { print i }'\'

モチーフの背後にある考え方'\''は、最初の一重引用符が現在の一重引用符で囲まれた文字列を終了させるというものです。バックスラッシュの一重引用符は実際の一重引用符を追加し、最後の一重引用符は新しい一重引用符で囲まれた文字列を開始します。最後の'\'は と書くこともできます'\'''が、最後の 2 つのシングル クォーテーションは冗長なので省略しました。

于 2013-03-30T00:28:00.817 に答える