Ayuda con script en bash [Solucionado]

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
ramonovski
Forista Medio
Forista Medio
Mensajes: 398
Registrado: Lun Sep 06, 2010 4:30 am

Ayuda con script en bash [Solucionado]

Mensaje por ramonovski » Mié Feb 15, 2012 7:46 am

Ando realizando un script para cambiar el modo "governor" de frecuencia del CPU que ofrece la utilidad cpufreq

La cosa es simple, obtengo los números de nucleos que tengo y una vez obtenidos le aplico la utilidad esa.

Código: Seleccionar todo

IFS="$(printf '\n\t')"
CPUSET=$(which cpufreq-set)
CPUINFO=$(which cpufreq-info)
CURRENT=$("${CPUINFO}" | grep 'The governor' | awk '{print $3}' | tr -d '"' | tail -1)
CORES=$(cat /proc/cpuinfo | grep 'processor' | wc -l)
CORESN=$(seq -s ' ' 0 1 "$((${CORES:-5}-1))") # en esta linea acomodo los nucleos de tal forma que me queden "0 1 2 3 ..."

if [[ ${CURRENT} != $1 ]]; then
	for i in "${CORESN}"; 
		do 
			sudo ${CPUSET} -c "${i}" -g "$1"; done
			echo "Governor mode has changed from'"${CURRENT}"' to '"${1}"'"
else
	echo ""${1}" mode currently loaded"
fi
El asunto es que solo me aplica los cambios para el primer nucleo, y los otros quedan en el modo anterior.

La cosa funciona con un simple:

Código: Seleccionar todo

for i in 0 1 2 3 4 5... ; do cpufreq-set -c $i -g ondemand|performance|etc; done
Pero me veo en la necesidad de automatizar ese proceso y obtener los números de nucleos porque el script lo estaré ejecutando en distintos sistemas con distintos nucleos, unos con distindo kernel compilados con distindos nucleos y etc.

¿Alguna recomendación para obtener los nucleos de otra manera?

Gracias por leer.
Última edición por ramonovski el Jue Feb 16, 2012 7:36 am, editado 1 vez en total.
scrotwm@FreeBSD
pekwm@Sabayon
::vim::zsh::urxvtd|blog::dotfiles::last.fm
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: Ayuda con script en bash

Mensaje por niky45 » Mié Feb 15, 2012 3:56 pm

hoy estoy un poco espesa, pero no me acabo de enterar. dejame hacerte un par de preguntas.....

el script grande es el que "cambia" el governor, y el chico, el que sirve para que efectivamente cambie TODOS los cores, verdad??
ramonovski escribió:Pero me veo en la necesidad de automatizar ese proceso y obtener los números de nucleos porque el script lo estaré ejecutando en distintos sistemas con distintos nucleos, unos con distindo kernel compilados con distindos nucleos y etc.
como lo estas ejecutando ahora??

digo, mi idea es, si con el primero lo cambias para uno, y ocn el segundo efectivamente hace que se cambien todos, por que no, simplemente, los juntas?? :?

(aka, que yo me entere... ademas de los scripts, puedes poner lo que estas haciendo?)

la opcion b es que le eches un ojo a esto. escalado dinamico de frecuencias con conky. :wink:
http://man-linux.comli.com/?p=241 (dichoso p4clockmod :evil: )
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1802
Registrado: Dom Oct 10, 2004 7:00 am

Re: Ayuda con script en bash

Mensaje por neurus » Mié Feb 15, 2012 6:10 pm

Y si ya tomas la información de /proc, en lugar de simplemente contarlos con wc -l, puedes utilizar awk y un for:

Código: Seleccionar todo

cat /proc/cpuinfo |grep processor|awk '{print $3}'
¿Por qué no aplicas el for antes de eso? Es decir, que la salida (0,1,2, etc) sea la iteración utilizada para ejecutar lo que sea que ejecutes sobre cada núcleo.
Avatar de Usuario
ramonovski
Forista Medio
Forista Medio
Mensajes: 398
Registrado: Lun Sep 06, 2010 4:30 am

Re: Ayuda con script en bash

Mensaje por ramonovski » Jue Feb 16, 2012 5:56 am

neurus escribió:Y si ya tomas la información de /proc, en lugar de simplemente contarlos con wc -l, puedes utilizar awk y un for:
Fue algo que intenté, pero de esa manera sigue aplicando el cambio al primer nucleo solamene, asumí que había que darle el formato tipo "0 1 2 3 n". como en el ejemplo del simple for que puse en el primer post, por eso el asunto del wc y el seq para darle "formato".
el script grande es el que "cambia" el governor, y el chico, el que sirve para que efectivamente cambie TODOS los cores, verdad??
Así es.
como lo estas ejecutando ahora??
script.sh parametro posicional1, donde el parámetro uno puede ser uno de los distintos modos que tiene cpufreq: powersave, ondemand, conservative, performance.

Sobre lo de tu post (aprovechas siempre para meter spam eh! -broma-), lo que haces es definir frequencias en cantidades. Eso es algo que tal vez luego considere solo para el modo "on demand", pues por default este modo empieza a utilizarlo realmente hasta que uno de los nucleos alcanza cierto nivel de frecuencia.

Gracias por sus respuestas, dejaré un ratito más esto y si no, a stackoverflow.
Desde un inicio plantee ponerlo por allá pero habría que poner a trabajar a más de uno por aquí =P
scrotwm@FreeBSD
pekwm@Sabayon
::vim::zsh::urxvtd|blog::dotfiles::last.fm
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1802
Registrado: Dom Oct 10, 2004 7:00 am

Re: Ayuda con script en bash

Mensaje por neurus » Jue Feb 16, 2012 6:21 am

En ese caso, reemplaza los saltos por espacios:

cat /proc/cpuinfo |grep processor|awk '{print $3}'|tr '\n' ' '

Lo que dejaría (obviamente sin chequear):

for i in $(cat /proc/cpuinfo |grep processor|awk '{print $3}'|tr '\n' ' ') ; do cpufreq-set -c $i -g ondemand|performance|etc; done
Avatar de Usuario
ramonovski
Forista Medio
Forista Medio
Mensajes: 398
Registrado: Lun Sep 06, 2010 4:30 am

Re: Ayuda con script en bash

Mensaje por ramonovski » Jue Feb 16, 2012 7:35 am

Vale, gracias.

Me he dado cuenta que el problema reside en el for, a la hora de evaluar la variable CORESN, de tal forma que:

Código: Seleccionar todo

$(cat /proc/cpuinfo |grep processor|awk '{print $3}' )
evaluado directamente en el ciclo for hace el trabajo para todo los nucleos, pero no lo hace con:

Código: Seleccionar todo

cat /proc/cpuinfo |grep processor|awk '{print $3}'|tr '\n' ' '
Ni con:

Código: Seleccionar todo

CORES=$(cat /proc/cpuinfo | grep 'processor' | wc -l)
$(seq -s ' ' 0 1 "$((${CORES:-5}-1))")

En fin, gracias neurus.
scrotwm@FreeBSD
pekwm@Sabayon
::vim::zsh::urxvtd|blog::dotfiles::last.fm
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje