셸 대기 열 제어 병행 스 크 립 트 구현
#!/bin/bash
date
DIR=/test/log/
FILE_NAME=65535_`date +"%Y%m%d"`;
FILE_NAME_LAST_DAY=`date -d "yesterday" +"%Y%m%d"`;
time_of_system=`date +"%Y-%m-%d"`
function multi_processor(){
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创建有名管道
exec 3<>/tmp/fd1 #创建文件描述符,以可读()的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性
rm -rf /tmp/fd1 #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
for ((i=1;i<=30;i++)) #30这个具体可以根据系统的cpu核数来调整
do
echo >&3 #&3代表引用文件描述符3,这条命令代表往管道里面放入了一个"令牌"
done
for file in $1
do
read -u3 #代表从管道中读取一个令牌
{
grep $3 $file | awk -F"|" '{print $7}' | sort | uniq >> $2; #具体的批量过滤逻辑
echo >&3 #代表我这一次命令执行到最后,把令牌放回管道
}&
done
wait
exec 3#关闭文件描述符的读
exec 3>&- #关闭文件描述符的写
}
#register 1 day ago
register_file=register_file_1_day_ago_$HOSTNAME.txt
file_modify_time=`stat $register_file | grep Modify | awk '{print $2}'`
files_last_day=`find $DIR -type f -name "$FILE_NAME_LAST_DAY*"`
if [[ $file_modify_time != $time_of_system ]]; then
echo "$register_file file_modify_time(${file_modify_time}) time_of_system(${time_of_system})"
rm $register_file
multi_processor "$files_last_day" "$register_file" "REGISTER"
fi
코드 분석 및 문제:
1. 파 이 프 는 하 나 를 저장 하고 하 나 를 읽 으 면 하나 가 줄 어 들 고, 없 으 면 막 히 고, 다시 놓 는 것 은 반복 해서 찾 을 수 있 는 대기 열 특성 이 있 습 니 다. 그러나 문 제 는 파이프 파일 에 내용 을 넣 으 면 아무 도 찾 지 않 으 면 막 힌 다 는 것 입 니 다. 그러면 영원히 파이프 에 10 개의 내용 을 동시에 넣 을 수 없습니다 (10 개의 약숟가락 이 되 고 싶 습 니 다).이 문 제 를 해결 하 는 관건 은 바로 파일 설명자 이다.
2. mkfifo/tmp/fd1 유명 파이프 파일 exec 3 < >/tmp/fd1 을 만 들 고 파일 설명자 3 관련 파이프 파일 을 만 듭 니 다. 이때 3 이 파일 설명 자 는 파이프 의 모든 특성 을 가지 고 있 으 며 파이프 가 없 는 특성 도 가지 고 있 습 니 다.인용 파일 설명 자 를 쓸 내용 이 있 는 지 에 대해 서도 신경 쓰 지 마 세 요: & 3 n 회 echo > & 3 을 파이프 에 n 열 쇠 를 넣 을 수 있 습 니 다.
3. 두 개의 for 순환, 첫 번 째 for 순환 10 회, 여자 공중 화장실 입구 에 열 쇠 를 10 개 놓 은 것 과 같 습 니 다. 두 번 째 for 순환 1000 회, 1000 명 이 화장실 에 오 는 것 과 같 습 니 다. read - u3 는 약 숟가락 을 가 져 가 는 것 과 같 습 니 다. {} 안의 마지막 줄 코드 echo > & 3 은 화장실 에 가서 약 숟가락 을 돌려 주 는 것 과 같 습 니 다.
4. 이렇게 해서 10 개의 약 숟가락 으로 1000 개의 임 무 를 제어 하 는 운행 을 실현 했다. 운행 시간 은 101 s 로 방안 2 보다 빠 르 지 않 을 것 이다. 그러나 방안 1 보다 훨씬 빠르다. 이것 은 바로 대열 이 같은 시간 에 최대 10 개의 스 레 드 만 병행 하 는 것 이다. 효율 을 높 일 뿐만 아니 라 병 발 통 제 를 실현 했다.
5. 파일 설명자 exec 3 < >/tmp/fd1 을 만 들 때 빈 칸 이 있어 서 는 안 됩 니 다. 파일 설명자 3 은 읽 기 () 권한 이 있 습 니 다. 열 때 같이 쓸 수 있 습 니 다. 닫 을 때 스위치 를 나 누 어야 합 니 다. exec 3 & - 닫 기 쓰기.
다음으로 이동:https://www.cnblogs.com/chenjiahe/p/6268853.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단 한 로그 인, 대량 실행 명령, 대량 copy 파일 셸 스 크 립 트 [Linux 운영 의 길 스 크 립 트 사례]이름: satool PS: (동료 들 을 바보 토끼 라 고 부 를 수 있 습 니 다) 기능: 이 스 크 립 트 는 명령 을 대량으로 실행 하고 파일 을 복사 하 며 간단하게 로그 인 할 수 있 습 니 다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.