2013-03-30 2 views
1

Я не программное обеспечение/скриптовый фольклорный себя так изо всех сил, чтобы понять, что происходит здесь:Что не так с этой командой?

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

В основном я хотел напечатать значение размера Resident Set моего Snmp демона 5 раз в секунду (равноправный разрешающая способность). Затем я намереваюсь построить из этого, чтобы перенаправить вывод в текстовый файл для последующего анализа, где я могу поместить данные в граф, например.

Проблема у меня в том, что я могу запустить следующий штраф:

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

Однако мне требуется только числовое значение только так, используя AWK вырезать все, но это значение имеет важное значение.

Запуск первой команды выше возвращает ошибку, и я подозреваю, что из-за способа смотреть обрабатывает одинарные кавычки, но я не достаточно умен, чтобы понять это ....

Любые предложения?

Кроме того, я прочитал, что

pmap -x [pid] 

тоже работает, но когда я запускаю его с соответствующего PID выхода SNMPD равен нулю, когда ясно, что это не так. Есть идеи по этому поводу?

С уважением.

ответ

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 один аргумента, но он не содержит кавычек. Что watch получает, как его третий аргумент:

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

С вашей awk -линии, 1watch` получает несколько аргументов:

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

И он не знает, что делать с избытком. (NB: значение $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 }'\' 

Идея '\'' мотива является то, что первым апостроф завершает текущие одинарные кавычки; обратная косая черта добавляет фактическую одинарную кавычку, а последняя одиночная кавычка запускает новую строку с одним кавычком. '\' в конце также можно было бы написать '\''', но последние две одинарные кавычки являются излишними, поэтому я их оставил.

+0

Спасибо за ваши усилия JL. Мне нравится объяснение и предложение двойных кавычек, что имеет смысл. * awk * однако не нравится использование двойных кавычек, хотя ... Я потерялся на этом. –

+0

Я с уверенностью уверен, что диагностика того, что пошло не так, находится на мишени. Труднее быть уверенным в замене. Вы говорите, что это не работает. Но файл '$ (pgrep ...) работал нормально. На странице man для ['watch'] (http://linux.about.com/library/cmd/blcmdl1_watch.htm) говорится: _Примечание, что__используется для команды« sh -c », что означает, что вам может потребоваться дополнительное использование цитируя, чтобы получить желаемый эффект. –

+0

ОК. Без указания команды * watch *, * awk * не нравится использование двойных кавычек. Поэтому при передаче на экран * awk * все еще возникает ошибка. Тем не менее, ваш вариант с одиночной кавычкой работает нормально. Большое спасибо. –

Смежные вопросы