2013-03-30 4 views
1

내 자신이 너무 무엇을 이해하는 데 어려움을 겪고 소프트웨어/스크립트 민속 아니에요 여기에 무슨 일이 일어나고 :이 명령에 어떤 문제가 있습니까?

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

은 기본적으로 내가 박람회 (두 번째 5 번 내 SNMP 데몬의 상주 세트 크기 값을 인쇄 걸려 해결). 그런 다음 예를 들어 그래프에 데이터를 넣을 수있는 나중의 분석을 위해 출력을 텍스트 파일로 리디렉션하기 위해이 빌드를 시도합니다.

내가 여기에이 문제는 내가 잘 다음 실행할 수 있습니다 :

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

그러나 나는 단지 그렇게 그 값이 중요하지만 모든 것을 제거하는 AWK를 사용하여 단지 숫자 값이 필요합니다.

어떤 제안 .... 첫 번째 명령은 위의 오류를 반환 내가는 작은 따옴표를 처리하고보고하는 방식 로 인해 의심 실행,하지만 난 충분히 이해하기 스마트 아니에요?

또한, 나는

pmap -x [pid] 

내가 SNMPD의 각각의 PID 출력과 실행 그러나 때, 너무 작동이되지 않을 때 분명히 제로입니다 읽었습니다. 이것에 대한 아이디어가 있습니까?

감사합니다.

답변

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으로 전송됩니다. 이전에는 여러 개의 인수가있었습니다.

참고하여 작업 명령에, 당신이 그 : 중간 '01'사이의 문자가 아닌 쉼표 비어 있기 때문에

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

이제, 쉘이 watch 하나의 인자를 제공하기 위해 계속, 따옴표가 포함되어 있지 않습니다.

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

당신의 awk - 라인, 1watch` 가져 여러 인수가 :

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

을 그리고 그것은 과잉 무엇을 해야할지하지 않습니다 세 번째 인수가 무엇이라고 watch 가져옵니다. (NB : $1의 값은 쉘의 현재 $1입니다. 빈 문자열 일 수도 있습니다.이 경우 $1에 해당하는 인수는 생략됩니다.내가 테스트를 어디 snmpd이 시스템에서 실행되지 않았다 - 실제로 실행중인 프로그램에 대한 보았을 때)


이 변형의 awk 스크립트에서 $1 전에 백 슬래시 (나를 위해 일 듯 사물이 때문에) 그의 붕괴 :

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

당신이 그때 당신은 컴팩트 좀 덜 일을 할 필요가없는 snmpd 과정이 없다는 것을 어떤 위험이 있다고 생각되면

. 그것은 내가 테스트 한 명령이다. sh -c 대신 watch -n 0.2을 넣을 수 있습니다. 그러나 watch에 대한 man 페이지가 명시 적으로 말할 않습니다 : 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 ...) '작업은 정상적으로 처리되었습니다. ['watch'] (http://linux.about.com/library/cmd/blcmdl1_watch.htm)의 man 페이지는 다음과 같이 말하고 있습니다 : _shote_command _는 "sh -c"에 주어 졌으므로 여분의 것을 사용해야 할 수도 있습니다 원하는 효과를 얻기 위해 인용 ._ –

+0

OK. * watch *에 명령을주지 않으면 * awk *는 큰 따옴표를 사용하는 것을 좋아하지 않습니다. 따라서 * awk *가 오류를 생성하는 것을보기 위해 전달되었을 때. 즉, 단일 견적 변형이 잘 작동합니다. 많은 감사합니다. –