Shell 스 크 립 트 의 다 중 작업 을 동시에 수행 합 니 다.
3551 단어 Shell다 중 프로 세 스병발 하 다Linux 시스템
#!/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
따라서 순환 적 으로 실행 할 명령 간 에 의존 관계 가 없 을 때 동시 실행 방식 을 사용 하면 코드 집행 효율 을 크게 높 일 수 있다.물론 병행 집행 에 도 결함 이 있다. 즉, 병행 집행 해 야 할 명령 의 수량 이 특히 많다. 특히 실 행 된 명령 이 차지 하 는 시스템 자원 이 매우 많 을 때 전체 시스템 의 자원 을 모두 소모 하고 다른 프로그램의 운행 에 영향 을 줄 수 있 기 때문에 다른 기술 을 통 해 병행 집행 하 는 프로 세 스 의 수량 을 제한 할 수 있다. 비교적 복잡 하기 때문에 본 고 는 소개 하지 않 겠 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Shell alias 명령에 별칭을 설정하는 방법명령에 별명을 설정하면 명령의'작은 이름'으로 삼을 수 있지만, 이렇게 하는 것이 무슨 의미가 있습니까? 이때 별명이 작용할 수 있다.vim 명령의 별명을vi라고 정의하면 이후에 실행된vi 명령은 실제로vim 명령을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.