Tengo dos archivos de texto:
archivo #1:dominio.txt
cocacola.com
airtel.com
pepsi.com
archivo #2:servidores.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
Necesito escribir un script, que asignará cada dominio (uno por uno, de arriba a abajo domains.txt
) al servidor (a server.txt
) que tiene la carga mínima en un instante dado (si hay un empate en la carga mínima, entonces el servidor se asigna con FCFS).
Finalmente quiero escribir un script para hacer lo anterior y luego crear un nuevo archivo con modificaciones llamado: allocation.txt
.
En el ejemplo anterior, allocation.txt
la salida tendrá (después de la ejecución del script):
192.0.53.42 , 4
192.53.1.2 , 3 , cocacola.com , airtel.com
192.36.155.21 , 3 , pepsi.com
¡Agradecería cualquier ayuda/orientación!
¿Cuál sería su enfoque básico para resolver este problema? ¿Se puede lograr todo esto con un solo guión?
Respuesta1
El siguiente script de Python debería hacer lo que quieras:
#!/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
Respuesta2
En lugar de almacenar la información en archivos de texto plano, puede utilizar el sistema de archivos. Por ejemplo, tenga un archivo por dirección IP en su grupo. Asignar un dominio a la dirección IP seríaenlaceun archivo de dominio al archivo de dirección IP. Entonces sabrá cuál es la asignación actual de la dirección IP al observar la cantidad de enlaces (que es una información fácilmente disponible ya que está almacenada en el inodo). Y no tiene que preocuparse por reescribir archivos planos cada vez y garantizar acceso exclusivo a esos archivos planos. Puede utilizar otros atributos del archivo (como mtime, ctime, uids) para almacenar otra información sobre las direcciones IP.
Por ejemplo:
$ 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
Arriba, la cantidad de enlaces (5, 3, 2) es uno más la cantidad de dominios asignados a la dirección IP.
(Re)asignar un dominio es entonces sólo una cuestión de:
#! /bin/zsh -
domain=domain/$1
rm -f $domain
least_loaded_ip=(ip/*(ol[1]))
ln -f $least_loaded_ip $domain
Desasignar es sólo
#! /bin/zsh -
domain=domain/$1
rm -f $domain
Obtener la IP de un dominio es solo
#! /bin/zsh -
domain=domain/$1
cat $domain
(suponiendo que el archivo contenga la dirección IP)
Obtener la lista de dominios asignados a una dirección IP (con búsqueda de GNU).
#! /bin/zsh -
ip=ip/$1
find domain -samefile $ip -printf '%P\n'
Luego, como beneficio adicional, la fecha ctime
del archivo es la última vez que se le asignó o desasignó un dominio. También puedes usar mtime
(usando touch
) para almacenar otro tiempo relacionado con él.
Utiliza un inodo por dirección IP. Si sus sistemas de archivos tienen directorios indexados/hash, obtener la dirección IP de un dominio sería muy rápido. Todas las operaciones ln
y rm
son atómicas, por lo que dos llamadas simultáneas a esos scripts no estropearían las cosas.