2초마다 netstat 명령을 텍스트 파일로 출력하는 방법

2초마다 netstat 명령을 텍스트 파일로 출력하는 방법

다음을 수행하려고 노력하고 있지만 예상대로 작동하는 데 어려움을 겪고 있습니다. watch 명령을 사용해 보았으나 출력이 엉망이었습니다. 다음을 찾았지만 내 요구에 맞게 작동시키지 못했습니다.

watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"

다음 명령을 실행하고 2초마다 다음 두 열이 있는 파일에 출력하고 싶습니다.

netstat -a | grep 20427 | grep ESTABLISHED | wc- l

DATE_TIME | NUMBER_OF_CONNECTIONS
Fri Nov  6 14:57:37 | 5
Fri Nov  6 14:57:39 | 10
Fri Nov  6 14:57:41 | 5
Fri Nov  6 14:57:43 | 2

귀하가 제공할 수 있는 도움에 감사드립니다. 조심하고 안전하세요.

답변1

watch는... 음, 보고 싶을 때 좋은 도구입니다. 터미널과 상호 작용합니다. 출력을 파일로 리디렉션하면 결국 파일에 기록된 터미널 제어 시퀀스를 찾을 수 있습니다. 이것이 당신이 시도한 것이라면 그러한 시퀀스는 아마도 당신이 언급한 엉망일 것입니다.

루프에서 명령을 실행하는 간단한 방법은… 음, 루프를 사용하는 것입니다. :)

netstat | …"2초마다" 실행하고 싶다고 하셨습니다 . 루프에는 두 가지 옵션이 있습니다.

  1. 파이프라인을 2초 동안 비동기식으로 실행 sleep하고 새 파이프라인을 실행합니다. 등등. 이렇게 하면 거의 완벽하게 "2초마다"가 됩니다. 그러나 단일 반복을 실행하는 데 간격보다 더 많은 시간이 걸리는 경우 해당 반복의 출력은 다음 반복의 출력 뒤에 나타나거나 인터리브될 수도 있습니다.

  2. 파이프라인을 2초 동안 동기식으로 실행 sleep하고 새 파이프라인을 실행합니다. 등등. 이렇게 하면 "2초마다"가 아니라 "2초 간격"이 됩니다. 그러나 특정 순간에 최대 하나의 파이프라인이 실행되므로 전체 출력이 엉망이 될 위험이 없습니다.

메모는 약 10초마다 watch -n 2 'sleep 10; date'실행됩니다 . date자체적 watch으로는 "2초마다"가 아닌 "2초 간격" 방식을 사용합니다.

whatever2초 간격으로 실행되고 출력을 파일로 리디렉션하는 루프는 다음과 같습니다.

while :; do whatever; sleep 2; done >output_file

귀하의 경우에는 두 가지 추가 문제가 있습니다.

  1. 헤더를 원합니다. 먼저 파일에 배치한 다음 >>파일에 ( )를 추가합니다.

  2. 날짜가 다음과 같은 줄에 있기를 원합니다. 사용자 정의 형식을 사용하더라도 출력은 date개행 문자로 끝납니다. 으로 제거할 수 있습니다 tr. 또는 출력을 변수로 캡처하고( $()후행 줄 바꿈을 모두 제거함) 나중에 인쇄합니다.

이와 같이:

echo 'DATE_TIME | NUMBER_OF_CONNECTIONS' >output_file
while :; do
   date="$(date)"
   printf '%s | ' "$date"
   netstat -a | grep 20427 | grep ESTABLISHED | wc -l
   sleep 2
done >>output_file

관련 정보