두 개의 텍스트 파일이 있습니다.
파일 1:도메인.txt
cocacola.com
airtel.com
pepsi.com
문서 #2:서버.txt
192.0.53.42 , 4 # 4 domains already allocated on server 192.0.53.42
192.53.1.2 , 1 # 1 domains already allocated on server 192.53.1.2
192.36.155.21 , 2 # 2 domains already allocated on server 192.36.155.21
주어진 순간에 최소 부하가 있는 서버(~)에 각 도메인(위에서 아래로 하나씩 )을 domains.txt
할당 하는 스크립트를 작성해야 합니다 server.txt
(최소 부하가 동점인 경우 서버는 FCFS로 할당됨). ).
궁극적으로 위의 작업을 수행하는 스크립트를 작성한 다음 다음이라는 이름의 새 수정된 파일을 생성하고 싶습니다 allocation.txt
.
위의 예에서 allocation.txt
출력은 다음과 같습니다(스크립트 실행 후).
192.0.53.42 , 4
192.53.1.2 , 3 , cocacola.com , airtel.com
192.36.155.21 , 3 , pepsi.com
도움이나 안내를 주시면 대단히 감사하겠습니다!
이 문제를 해결하기 위한 기본 접근 방식은 무엇입니까? 이 모든 것이 스크립트로 수행될 수 있습니까?
답변1
다음 Python 스크립트는 원하는 작업을 수행해야 합니다.
#!/usr/bin/python
serv=[]
for l in open("servers.txt","r").xreadlines(): # for each server
s,n = l.split(",") # extract server name and load
n=int(n.split("#")[0].strip()) # ignore comments
serv.append([s.strip(),n]) # store server and its load
for l in open("domain.txt","r").xreadlines(): # for each domain
m = serv.index(min(serv,key=lambda i:i[1])) # find server with lowest load
serv[m].append(l.strip()) # add the domain
serv[m][1]=serv[m][1]+1 # increase the load
alloc=open("allocation.txt","w")
for l in serv:
print>>alloc, " , ".join([l[0],str(l[1])] + l[2:]) # write output file
답변2
일반 텍스트 파일에 정보를 저장하는 대신 파일 시스템을 사용할 수 있습니다. 예를 들어 풀의 각 IP 주소에 대한 파일이 있습니다. IP 주소에 도메인을 할당하면링크도메인 파일을 IP 주소 파일로 변환합니다. 그런 다음 링크 수를 보면 현재 IP 주소 할당을 이해할 수 있습니다(이 정보는 인덱스 노드에 저장되어 있으므로 쉽게 얻을 수 있습니다). 매번 플랫 파일을 다시 작성하고 해당 플랫 파일에 대한 독점 액세스를 보장하는 것에 대해 걱정할 필요가 없습니다. 파일의 다른 속성(예: mtime, ctime, uid)을 사용하여 IP 주소에 대한 추가 정보를 저장할 수 있습니다.
예를 들어:
$ ls -lRi
.:
total 8
59597091 drwxr-xr-x 2 chazelas chazelas 4096 May 1 10:12 domain/
59597087 drwxr-xr-x 2 chazelas chazelas 4096 May 1 10:11 ip/
./domain:
total 28
59554312 -rw-r--r-- 5 chazelas chazelas 12 May 1 10:11 test1.com
59554312 -rw-r--r-- 5 chazelas chazelas 12 May 1 10:11 test2.com
59554312 -rw-r--r-- 5 chazelas chazelas 12 May 1 10:11 test3.com
59554312 -rw-r--r-- 5 chazelas chazelas 12 May 1 10:11 test4.com
59554314 -rw-r--r-- 2 chazelas chazelas 11 May 1 10:11 test5.com
59562599 -rw-r--r-- 3 chazelas chazelas 14 May 1 10:11 test6.com
59562599 -rw-r--r-- 3 chazelas chazelas 14 May 1 10:11 test7.com
./ip:
total 12
59554312 -rw-r--r-- 5 chazelas chazelas 12 May 1 10:11 192.0.53.42
59562599 -rw-r--r-- 3 chazelas chazelas 14 May 1 10:11 192.36.155.21
59554314 -rw-r--r-- 2 chazelas chazelas 11 May 1 10:11 192.53.1.2
위에서 링크 수(5, 3, 2)는 해당 IP 주소에 할당된 도메인 수에 1을 더한 값입니다.
도메인을 (재)할당하려면 다음을 수행하세요.
#! /bin/zsh -
domain=domain/$1
rm -f $domain
least_loaded_ip=(ip/*(ol[1]))
ln -f $least_loaded_ip $domain
할당 해제는 단지
#! /bin/zsh -
domain=domain/$1
rm -f $domain
도메인 이름의 IP를 얻는 것은 단지
#! /bin/zsh -
domain=domain/$1
cat $domain
(파일에 IP 주소가 포함되어 있다고 가정)
IP 주소에 할당된 도메인 목록을 가져옵니다(GNU 찾기 사용).
#! /bin/zsh -
ip=ip/$1
find domain -samefile $ip -printf '%P\n'
또한 ctime
파일의 시간은 도메인이 마지막으로 할당되거나 해제된 시간입니다. mtime
(을 사용하여 touch
)과 관련된 다른 시간을 저장할 수도 있습니다 .
IP 주소당 하나의 inode를 사용합니다. 파일 시스템에 인덱스/해시 디렉터리가 있으면 도메인의 IP 주소를 얻는 속도가 매우 빠릅니다. 모든 ln
AND rm
연산은 원자적이므로 이러한 스크립트에 대한 두 번의 동시 호출로 인해 문제가 발생하지 않습니다.