引用されたコマンドが正確である場合:
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 つのシングル クォーテーションは冗長なので省略しました。