1. 사용 명령어 |
(1) ping
(2) wait
(3) cat
2. 키워드 & 사용처 |
(1) 키워드
병렬 처리, 동기, 종료
(2) 사용처
여러 호스트에 ping 명령어를 실행하는 대기 시간을 줄이고자 병렬로 백그라운드 실행시키고 명령어 종료를 동기화해서 결과를 순서대로 출력하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./background-wait.sh
PING 192.168.2.1 (192.168.2.1): 56 data bytes
64 bytes from 192.168.2.1: icmp_seq=0 ttl=255 time=3.554 ms
64 bytes from 192.168.2.1: icmp_seq=0 ttl=255 time=3.435 ms
64 bytes from 192.168.2.1: icmp_seq=0 ttl=255 time=3.469 ms
(생략. 두 번째, 세 번째 ping 결과가 출력됨)
4. 스크립트 |
#!/bin/sh
# 호스트 세 개를 병렬로 ping 실행.
# 6번 반복해서 각가 5초 대기
ping -c 6 192.168.2.1 > host1.log & ①
ping -c 6 192.168.2.1 > host2.log & ①
ping -c 6 192.168.2.1 > host3.log & ①
# 모든 ping 명령어가 종료할 때까지 대기, 동기화
wait ②
# ping 명령어 결과 출력
cat host1.log host2.log host3.log ③
5. 해설 |
이 스크립트는 여러 서버에 ping 명령어를 실행해서 네트워크 개통을 확인하고 그 결과를 표시합니다. ping 명령어는 백그라운드로 병렬 실행하지만 마지막 결과를 표시하기 전에 wait 명령어로 동기화한다는 것이 중요합니다.
①은 192.168.2.1, 192.168.2.2, 192.168.2.3이라는 세 호스트에 ping 명령어로 ICMP 패킷을 보냅니다. 이때 결과를 각 로그 파일(host1.log, host2.log, host3.log)에 출력합니다. ICMP 패킷을 보내는 횟수는 -c 옵션으로 6번을 지정합니다.
ping 명령어로 ICMP 패킷을 여러 번 보내며 자동으로 1초간 대기합니다. 즉, 6번 ping을 실행하면 중간에 5번 대기가 있어서 적어도 5초는 걸리게 됩니다. 예제에서는 3대에 ping을 실행하므로전체적으로5초 x 3 = 15초가 걸리게 됩니다. 수를 늘릴수록 대기 시간도 늘어나게 됩니다. 그리고 ①은 시간 단축을 위해 ping 마지막에 &를 각각 붙여서 백그라운드로 실행합니다. 이렇게 백그라운드로 병렬 실행하면 (응답 시간을 무시한다면) 3개의 ping은 5초 정도에 끝납니다.
②는 wait 명령어로 백그라운드로 실행한 ping 명령어를 동기화합니다. 단순히 명령어를 병렬로 처리하고 백그라운드로 실행시킨다면 &만 붙이면 됩니다. 하지만 각각 명령어의 종료를 알 수 없어서 스크립트 마지막에 결과를 표시할 수 없습니다. 이 예제처럼 종료 결과를 표시하고 싶으면 wait 명령어로 동기화해야 합니다.
wait 명령어를 인수 없이 실행하면 스크립트에서 실행된 백그라운드 실행 명령어 종료를 기다립니다. 예제에서는 마지막 ping 결과를 순서대로 표시하기 위해 모든 ping 명령어의 종료를 기다립니다. 따라서 wait 명령어를 사용하면 각각 백그라운드로 실행한 ping 명령어가 끝나길 기다렸다가 다음 줄을 실행합니다.
③은 모든 ping 명령어 출력 결과를 cat 명령어로 표시합니다. ②에서 wait 명령어를 사용했으므로 이 cat 명령어를 실행하면 세 ping 명령어가 종료되어 결과가 제대로 표시됩니다.
<주의사항>
너무 많은 백그라운드 처리를 병렬로 실행하면 네트워크가 혼잡해져서 이런 네트워크 진단 툴이 제대로 동작하지 못할 수 있습니다. 따라서 결과를 보면서 동시 실행하는 명려어 수를 적당히 조절해야 합니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 제어 구문 - 098 변수가 포함된 IP 주소 목록 파일을 읽어서 ping 명령어로 확인하기 (0) | 2021.04.19 |
---|---|
[Linux 셸 스크립트] 셸 기능 다루기 - 097 셸 스크립트 일부에 Perl이나 Ruby 사용하기 (0) | 2021.04.19 |
[Linux 셸 스크립트] 셸 기능 다루기 - 095 여러 URL 파일을 동시에 병렬로 내려받기 (0) | 2021.04.19 |
[Linux 셸 스크립트] 셸 기능 다루기 - 094 명령어가 실패한 시점에 종료해 스크립트 오작동 방지하기 (0) | 2021.04.15 |
[Linux 셸 스크립트] 셸 기능 다루기 - 093 리다이렉트가 번잡하지 않도록 그룹핑해서 보기 좋게 만들기 (0) | 2021.04.14 |
댓글