2013-09-28 3 views
1

안녕하세요.리눅스 감시 명령이 스크립트에서 작동하지 않습니다.

포트 (이 경우 80)에 대한 연결을 주기적으로 모니터링하기위한 스크립트를 작성하고 있습니다.

나는이 짧은 스크립트를 작성합니다.

================================= 
COMMAND PID USER NODE 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
acwebseca 90 root TCP 
Total SSH Connections: 19 
================================= 

그러나 시도가 시계 명령을 사용할 때 나에게 오류를 발생 내가 명령을 취소 할 때 나는이 같은 오류가 표시 출력을 볼 수 없습니다 :

echo '=================================';a=`sudo lsof -i :80`;echo $a | awk '{print $1," ",$2," ",$3," ",$8}'; b=`echo $a | wc -l`; b=$(($b - 1));echo Total SSH Connections: $b;echo '=================================' 

출력은

sh: PID: command not found 
          sh: -c: line 1: syntax error near unexpected token `(' 
                       sh: -c: line 1: `acwebseca 90 root 37u IPv4 0x81ae738f91e7bed9  0t0 TCP 192.168.0.11:49915->108.160.163.33:http (ESTABLISHED)' 

어떻게 해결할 수 있습니까?

watch -n 2 "echo '=================================';a=`sudo lsof -i :80`;echo $a | awk '{print $1," ",$2," ",$3," ",$8}'; b=`echo $a | wc -l`; b=$(($b - 1));echo Total SSH Connections: $b;echo '================================='" 

답변

3

스크립트를 파일에 쓰고 실행하면 작동합니다. 그 다음은 끔찍한 한 줄 일 필요는 없으며, 다음과 같이 할 수 있습니다

echo '=================================' 
a=`sudo lsof -i :80` 
echo $a | awk '{print $1," ",$2," ",$3," ",$8}' 
b=`echo $a | wc -l` 
b=$(($b - 1)) 
echo Total SSH Connections: $b 
echo '=================================' 

그냥 파일에 넣어, 그리고 watch my-script.sh를 실행합니다. 이렇게하면 문제가 해결되고 코드를 동시에 읽을 수 있습니다.

편집 : 당신이 정말 나쁜 생각 한 라이너를 원한다면, 당신이 시도 할 수 있습니다 :

watch 'echo =================================;a=`lsof -i :80`;echo $a | awk "{print \$1, \$2, \$3, \$8}"; b=`echo $a | wc -l`; b=$(($b - 1));echo Total SSH Connections: $b;echo =================================' 

는 기본적으로 나는 제대로 실행하기 위해 인용 조정; awk 포맷을 약간 엉망으로 만들었지 만, 필요할 경우 다시 해킹 할 수 있다고 확신합니다. 명령

+0

알고 있습니다. 그러나 "하나의"줄로 만들 수있는 방법이 있나. ? – crsuarezf

+2

왜 하시겠습니까? 나의 더 나은 판단에 반하여, 나는 그 대답의 예를 덧붙였다. –

+0

예, 코드의 가독성에 관계없이 작동해야했습니다. – crsuarezf

0

인용

, man watch에서 참고 당신이 원하는 효과를 얻기 위해 인용 추가 사용 을해야 할 수도 있음을 의미하는 "쉬 -c"제공됩니다. 이 을 -x 또는 --exec 옵션으로 비활성화하면 명령을 exec (2)에 대신 전달할 수 있습니다.

Note that POSIX option processing is used (i.e., option processing stops at the first non-option argument). This means that 

후 명령은 시계 자체로 해석되지 않습니다.

+0

어디에 적용해야합니까? 탁상 시계 사용법 : watch [-dhntv] [--differences [= 누적]] [--help] [--interval = ] [--no-title] [--version] crsuarezf

+0

' x'는 매뉴얼이 말하는 것입니다, 나는 생각합니다. –

2

watch에 명령을 전달할 주소를 지정하지 않기 때문에 답변보다 더 많은 의견입니다. 그러나 서식을 지정하는 것은 어렵습니다. awk에서 더 많은 작업을하면 명령을 크게 단순화 할 수 있습니다.

sudo lsof -i :80 | awk ' 
     BEGIN { d="================================="; print d} 
     {print $1," ",$2," ",$3," ",$8}' 
     END { print "Total SSH Connections:", NR-1; print d}' 
+0

고마워요. @William_Pursell, 나는 그 중 하나를 찾고있었습니다.나는 이것이 당신과 같은 더 좋은 방법으로 성취 될 수 있다는 것을 알고 있습니다. 그러나 내부를 인용하여 시계 명령을 테스트하는 것이 었습니다. – crsuarezf

관련 문제