Shell 스 크 립 트 의 다 중 작업 을 동시에 수행 합 니 다.

정상 적 인 상황 에서 Shell 스 크 립 트 의 명령 은 직렬 로 실 행 됩 니 다. 명령 이 실행 되 어야 다음 명령 을 수행 할 수 있 습 니 다.예 를 들 어 다음 코드:
 #!/bin/bash
for i in {1..10};do
echo $i 
done
echo "END"

실행 결과:
1
2
3
4
5
6
7
8
9
10
END

순환 체 의 "echo $i"명령 은 직렬 로 실 행 된 것 을 볼 수 있 습 니 다.그러나 실행 하 는 명령 이 오래 걸 리 면 전체 프로그램의 실행 시간 이 매우 길 고 심지어 프로그램 이 실 행 될 때 거기에 걸 려 장시간 응답 을 잃 을 수도 있다.예 를 들 어 우 리 는 이러한 임 무 를 완성 해 야 합 니 다. 스 크 립 트 를 작성 하고 192.168.8.0/24 네트워크 에서 현재 온라인 호스트 가 어떤 것 이 있 는 지 스 캔 할 수 있 으 면 온라인 이 라 고 생각 합 니 다.이 작업 을 수행 하려 면 스 크 립 트 를 작성 하 는 것 이 복잡 하지 않 습 니 다. 다음은 작성 한 코드 입 니 다.
 #!/bin/bash
for i in {1..254};do
        ip="192.168.80.$i"
        ping -c 2 $ip &> /dev/null && echo $ip is up 
done

스 크 립 트 에 사용 되 는 ping 명령 에 대해 설명 합 니 다.Linux 의 ping 명령 은 실 행 된 후에 계속 패 키 지 를 보 냅 니 다. 따라서 스 크 립 트 의 ping 명령 은 '- c' 옵션 을 사용 하여 패 키 지 를 2 번 만 보 낼 것 을 지정 합 니 다. 응답 을 받 을 수 있 으 면 대상 호스트 가 온라인 이 라 고 생각 합 니 다.이 스 크 립 트 는 논리 적 으로 문제 가 없 지만, 실행 후 네트워크 에 있 는 254 개의 IP 주소 에 대해 핑 명령 을 번갈아 실행 해 야 하기 때문에 시간 이 매우 오래 걸 립 니 다. 또한 이 스 크 립 트 는 Ctrl + C 를 사용 하여 강제로 종료 할 수 없습니다. Ctrl + Z 를 사용 하여 백 엔 드 로 전환 한 다음 kill 명령 으로 프로 세 스 를 강제 종료 할 수 있 습 니 다.
 [root@localhost ~]# bash ping.sh
192.168.80.1 is up
192.168.80.2 is up
^C
^Z
[1]+  已停止               bash ping.sh
[root@localhost ~]# jobs -l                             #查看后台工作任务
[1]+ 101100 停止                  bash ping.sh
[root@localhost ~]# kill -9 101100                      #强制结束进程
[root@localhost ~]# 
[1]+  已杀死               bash ping.sh

실제로 이 스 크 립 트 에서 순환 적 으로 실행 되 는 ping 명령 사이 에는 의존 관계 가 없습니다. 즉, 'ping 192.168.801' 이 끝 난 후에 야 'ping 192.168.8.0.2' 를 계속 실행 할 필요 가 없습니다. 모든 ping 명령 은 동시에 실 행 될 수 있 습 니 다.Python 을 사용 하면 다 중 스 레 드 기술 을 통 해 명령 의 병행 을 실현 할 수 있 으 며, Shell 은 다 중 스 레 드 를 지원 하지 않 기 때문에 다 중 프로 세 스 방식 만 사용 할 수 있 습 니 다.구체 적 인 실현 방법 은 간단 하 다. 동시에 실행 할 명령 뒤에 '&' 를 붙 여 백 스테이지 로 옮 겨 집행 하 는 것 이다. 그러면 명령 을 수행 한 후에 그 집행 이 끝 날 때 까지 기다 리 지 않 고 바로 다음 명령 을 수행 할 수 있다.우 리 는 이전 코드 를 예 로 들 어 순환 체 의 echo 명령 에 '&' 를 추가 합 니 다.
 #!/bin/bash
for i in {1..10};do
echo $i &
done
echo "END"

실행 결과:
 [root@localhost ~]# bash test.sh
END
[root@localhost ~]# 1
2
3
6
7
4
8
9
10
5

동시 실행 시 명령 의 실행 순 서 를 보장 할 수 없 으 며, 전체 순환 실행 이 끝 난 후에 실행 해 야 할 echo 'END' 명령 이 프로그램 시작 과 동시에 실행 되 는 것 을 볼 수 있다.따라서 동시 실행 할 때 우 리 는 순환 체 의 모든 명령 이 실 행 된 후에 다음 명령 을 뒤로 실행 하도록 보장 해 야 한다. 이때 wait 명령 을 사용 하여 이 루어 질 수 있다.셸 에서 wait 명령 을 사용 하면 다른 고급 언어의 다 중 스 레 드 동기 화 에 해당 합 니 다.다음은 코드 를 개선 하고 wait 명령 을 추가 합 니 다.
 #!/bin/bash
for i in {1..10};do
echo $i &
done
wait
echo "END"

이렇게 집행 하면 결 과 는 정상이다.
 [root@localhost ~]# bash test3.sh
6
7
2
3
4
8
9
10
5
1
END

프로그램 이 동시에 실행 되 는 원 리 를 알 게 된 후에 저 희 는 ping 스 크 립 트 도 개선 합 니 다.
 #!/bin/bash
for i in {1..254};do
        ip="192.168.80.$i"
        ping -c 2 $ip &> /dev/null && echo $ip is up &
done
wait

이 때 스 크 립 트 의 실행 속도 가 크게 향 상 됩 니 다.
 [root@localhost ~]# bash ping.sh
192.168.80.10 is up
192.168.80.20 is up
192.168.80.2 is up
192.168.80.1 is up
192.168.80.135 is up

따라서 순환 적 으로 실행 할 명령 간 에 의존 관계 가 없 을 때 동시 실행 방식 을 사용 하면 코드 집행 효율 을 크게 높 일 수 있다.물론 병행 집행 에 도 결함 이 있다. 즉, 병행 집행 해 야 할 명령 의 수량 이 특히 많다. 특히 실 행 된 명령 이 차지 하 는 시스템 자원 이 매우 많 을 때 전체 시스템 의 자원 을 모두 소모 하고 다른 프로그램의 운행 에 영향 을 줄 수 있 기 때문에 다른 기술 을 통 해 병행 집행 하 는 프로 세 스 의 수량 을 제한 할 수 있다. 비교적 복잡 하기 때문에 본 고 는 소개 하지 않 겠 다.

좋은 웹페이지 즐겨찾기