웹사이트 검색

X초마다 Linux 명령을 영원히 실행하거나 반복하는 방법


시스템 관리자는 특정 기간 동안 명령을 반복적으로 실행해야 하는 경우가 많습니다. 이러한 작업은 간단한 크론 명령으로 쉽게 완료할 수 있는 경우가 많습니다. 대부분의 경우 이 방법은 작동하지만 cron 명령을 실행할 수 있는 가장 짧은 기간은 1분입니다. 믿거나 말거나, 많은 경우 이는 너무 느립니다.

이 튜토리얼에서는 기본적으로 3초마다 top 명령과 유사하게 지속적으로 실행되는 상태(프로세스 및 메모리 사용률을 지속적으로 모니터링)에서 특정 명령을 모니터링하거나 감시하는 간단한 스크립팅 기술을 배웁니다.

우리는 명령을 자주 실행해야 하는 이유에 대해 논의하는 것을 멈추지 않을 것입니다. 일상 업무에서나 심지어 집에서 PC나 노트북을 사용하는 경우에도 사람마다 그 이유가 다를 것이라고 생각합니다.

1. watch 명령 사용

Watch는 명령이나 프로그램을 주기적으로 실행하고 화면에 출력을 표시할 수 있는 Linux 명령입니다. 즉, 프로그램 출력을 제 시간에 볼 수 있다는 의미입니다. 기본적으로 watch는 2초마다 명령/프로그램을 다시 실행합니다. 요구 사항에 맞게 간격을 쉽게 변경할 수 있습니다.

메모리 사용량 모니터링

"Watch"는 사용하기 매우 쉽습니다. 테스트하려면 Linux 터미널을 즉시 실행하고 다음 명령을 입력하면 됩니다.

watch free -m

위 명령은 시스템 여유 메모리를 확인하고 2초마다 free 명령 결과를 업데이트합니다.

위 출력에서 볼 수 있듯이(왼쪽에서 오른쪽으로) 업데이트 간격, 실행 중인 명령, 현재 시간에 대한 정보를 표시하는 헤더가 있습니다. 이 헤더를 숨기려면 -t 옵션을 사용하면 됩니다.

다음 논리적 질문은 실행 간격을 변경하는 방법입니다. 이를 위해 명령이 실행되는 간격을 지정하는 -n 옵션을 사용할 수 있습니다. 이 간격은 초 단위로 지정됩니다. 따라서 script.sh 파일을 10초마다 실행하고 싶다면 다음과 같이 하면 됩니다.

watch -n 10 script.sh

참고 위와 같이 명령을 실행하는 경우 해당 디렉터리로 cd해야 합니다(15 cd 명령 예 알아보기). 스크립트를 찾거나 해당 스크립트의 전체 경로를 지정합니다.

watch 명령의 다른 유용한 옵션은 다음과 같습니다.

  1. -b – 명령 종료가 0이 아닌 경우 경고음을 생성합니다.
  2. -c – ANSI 색상 순서를 해석합니다.
  3. -d – 명령 출력의 변경 사항을 강조 표시합니다.

로그인한 사용자, 가동 시간 및 평균 부하 모니터링

로그인한 사용자, 서버 가동 시간 및 로드 평균 출력을 몇 초마다 지속적으로 모니터링하고 다음과 같이 다음 명령을 사용한다고 가정해 보겠습니다.

watch uptime

명령을 종료하려면 CTRL+C를 누르세요.

여기서 'uptime' 명령은 기본적으로 2초마다 실행되고 업데이트된 결과를 표시합니다.

복사 명령 진행 상황 모니터링

Linux에서는 cp 명령을 사용하여 한 위치에서 다른 위치로 파일을 복사하는 동안 데이터 진행 상황이 표시되지 않습니다. 복사되는 데이터 진행 상황을 보려면 watch 를 사용할 수 있습니다. 명령을 du -s 명령과 함께 사용하면 실시간으로 디스크 사용량을 확인할 수 있습니다.

cp ubuntu-15.10-desktop-amd64.iso /home/tecmint/ &
watch -n 0.1 du -s /home/tecmint/ubuntu-15.10-desktop-amd64.iso 

위의 프로세스가 너무 복잡해서 달성하기 어렵다고 생각되면 복사하는 동안 데이터 진행 상황을 보여주는 고급 복사 명령을 사용하는 것이 좋습니다.

2. 수면 명령 사용

Sleep은 쉘 스크립트를 디버깅하는 데 자주 사용되지만 다른 유용한 목적도 많이 있습니다. 예를 들어 for 또는 while 루프와 결합하면 매우 멋진 결과를 얻을 수 있습니다.

Bash 스크립팅을 처음 사용하는 경우 여기에서 Bash 루프에 대한 가이드를 확인할 수 있습니다.

'sleep' 명령에 대해 처음 듣는 경우, 이는 지정된 시간 동안 무언가를 지연시키는 데 사용됩니다. 스크립트에서는 이를 사용하여 스크립트에 명령 1을 실행하고 10초 동안 기다린 다음 명령 2를 실행하도록 지시할 수 있습니다.

위의 루프를 사용하면 bash에게 명령을 실행하고 N초 동안 절전 모드로 전환한 다음 명령을 다시 실행하도록 지시할 수 있습니다.

아래에서 두 루프의 예를 볼 수 있습니다.

for 루프 예

for i in {1..10}; do echo -n "This is a test in loop $i "; date ; sleep 5; done

위의 한 라이너는 echo 명령을 실행하고 현재 날짜를 총 10회 표시하며 실행 사이에는 5초의 휴면 시간이 있습니다.

다음은 샘플 출력입니다.

This is a test in loop 1 Wed Feb 17 20:49:47 EET 2016
This is a test in loop 2 Wed Feb 17 20:49:52 EET 2016
This is a test in loop 3 Wed Feb 17 20:49:57 EET 2016
This is a test in loop 4 Wed Feb 17 20:50:02 EET 2016
This is a test in loop 5 Wed Feb 17 20:50:07 EET 2016
This is a test in loop 6 Wed Feb 17 20:50:12 EET 2016
This is a test in loop 7 Wed Feb 17 20:50:17 EET 2016
This is a test in loop 8 Wed Feb 17 20:50:22 EET 2016
This is a test in loop 9 Wed Feb 17 20:50:27 EET 2016
This is a test in loop 10 Wed Feb 17 20:50:32 EET 2016

자신만의 명령이나 스크립트를 사용하여 echodate 명령을 변경하고 필요에 따라 절전 간격을 변경할 수 있습니다.

while 루프 예

while true; do echo -n "This is a test of while loop";date ; sleep 5; done

샘플 출력은 다음과 같습니다.

This is a test of while loopWed Feb 17 20:52:32 EET 2016
This is a test of while loopWed Feb 17 20:52:37 EET 2016
This is a test of while loopWed Feb 17 20:52:42 EET 2016
This is a test of while loopWed Feb 17 20:52:47 EET 2016
This is a test of while loopWed Feb 17 20:52:52 EET 2016
This is a test of while loopWed Feb 17 20:52:57 EET 2016

위 명령어는 사용자가 종료하거나 중단할 때까지 실행됩니다. 백그라운드에서 실행 중인 명령을 실행해야 하고 cron에 의존하고 싶지 않은 경우 유용할 수 있습니다.

중요: 위 방법을 사용할 때 다음 실행 전에 명령 실행을 완료하는 데 충분한 시간을 제공할 수 있도록 간격을 충분히 길게 설정하는 것이 좋습니다.

결론

이 튜토리얼의 샘플은 유용하지만 cron 유틸리티를 완전히 대체하기 위한 것은 아닙니다. 어느 것이 더 나은지 찾는 것은 여러분의 몫이지만, 두 기술의 사용법을 분리해야 한다면 다음과 같이 말할 것입니다.

  1. 시스템 재부팅 후에도 주기적으로 명령을 실행해야 하는 경우 cron을 사용하십시오.
  2. 현재 사용자 세션 내에서 실행될 프로그램/스크립트에 대해 이 튜토리얼에 설명된 방법을 사용하십시오.

언제나 그렇듯이, 질문이나 의견이 있으시면 주저하지 말고 아래 의견란에 제출해 주세요.