我有兩個文字檔:
文件#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 位址的域數量加一。
(重新)分配域只需執行以下操作:
#! /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 find)。
#! /bin/zsh -
ip=ip/$1
find domain -samefile $ip -printf '%P\n'
另外,ctime
文件的 是最後一次為其分配或釋放域的時間。您也可以使用mtime
(using touch
) 來儲存與其相關的另一個時間。
它為每個 IP 位址使用一個 inode。如果您的檔案系統有索引/雜湊目錄,那麼取得網域的 IP 位址將會非常快。所有ln
和rm
操作都是原子的,因此對這些腳本的兩個並發調用不會弄亂事情。