[gilug.org] problema amb bash script
David Casals hakd0c telefonica net
2007-05-23 13:01:36 UTC
Estic fent el següent programa (quant estigui a una versió mes avançada
sera llicenciat amb GPL), aquest es tipus cibercafe però només controla
el credit dels usuaris.
El programa es engegat quant un usuari inicia una sessió gràfica a
través d'un fitxer ubicat a: /etc/X11/Xsession.d/ i tot lo que fa es
comprovar el tipus d'usuari, si aquest te saldo i cada segon anar
restant el saldo, anar-ho notificant per pantalla i un cop s'acaba el
saldo bloqueja la pantalla.
El problema que tinc es que quant un usuari surt de la seva sessió el
programa no desapareix de memoria i continua decrementant el credi de
l'usuari.
Segur que es alguna parida, pero ja i porto algunes hores donant voltes
i no trobo en quin lloc m'equivoco.
##
## INICI DEL PROGRAMA
##
#AGAFO EL SEU ID D'USUARI A PARTIR DEL SOBRENOM QUE OBRA LA SESSIO
DBUSERID=$(mysql-query "SELECT id_usuari FROM usuari WHERE
sobrenom=\"$USERNAME\"";);
# COMPROVO SI ES EVENTUAL
TIPUS=$(mysql-query "SELECT tipus FROM usuari WHERE id_usuari=$DBUSERID";);
if [ $TIPUS = "Eventual" ]; then
# DEIXEM QUE LA SESSIÓ COMENCI ABANS DE MOSTRAR RES PER PANTALLA
sleep 10;
# REGISTRE DE LA SESSIÓ A LA BASE DE DADES
# ESTARIA BÉ POSAR-HI EL HOST
$(mysql-query "INSERT INTO sessio
(data_sessio,hora_sessio,idusuari,host,display,temps) VALUES
(CURDATE(),CURTIME(),$DBUSERID,\"$HOSTNAME\",\"$DISPLAY\",0);");
SESSID=$(mysql-query "SELECT MAX(id_sessio) FROM sessio WHERE
idusuari=$DBUSERID;");
osd_eventual
#MENTRE NO TANQUI LA SESSIO
while [[ ! $CLOSE_SESSION ]]; do
sleep 60;
# ACTUALITZAR LA BASE DE DADES (CRÈDIT I TEMPS DE SESSIÓ)
TEMPS=$(($TEMPS + 1))
$(mysql-query "UPDATE sessio SET temps=$TEMPS WHERE
id_sessio=$SESSID;");
osd_eventual;
done
#exit 0
#EN CAS DE NO SER EVENTUAL
else
# EN CAS DE NO TENIR CRÈDIT SUFICIENT PER A UN MINUT DE SESSIÓ, JA ES
# POT CANCEL·LAR LA SESSIÓ
get_credit;
if [[ $DBUSERID == "" || $CREDIT -lt $TARIFA ]];then
CLOSE_SESSION=1;
osd_err "L'usuari '$USERNAME' no te prou credit."
else
# DEIXEM QUE LA SESSIÓ COMENCI ABANS DE MOSTRAR RES PER PANTALLA
sleep 10;
# REGISTRE DE LA SESSIÓ A LA BASE DE DADES
# ESTARIA BÉ POSAR-HI EL HOST
$(mysql-query "INSERT INTO sessio
(data_sessio,hora_sessio,idusuari,host,display,temps) VALUES
(CURDATE(),CURTIME(),$DBUSERID,\"$HOSTNAME\",\"$DISPLAY\",0);");
SESSID=$(mysql-query "SELECT MAX(id_sessio) FROM sessio WHERE
idusuari=$DBUSERID;");
fi
# MENTRE L'USUARI NO VULGUI TANCAR LA SESSIÓ,
while [[ ! $CLOSE_SESSION ]];do
get_credit;
osd_credit;
# EN CAS DE QUE EL CRÈDIT DE NOMÉS CINC MINUTS
# AVISAR A L'USUARI QUE S'ESTÀ QUEDANT SENSE
MINUTS=$(($CREDIT/$TARIFA))
if [[ $MINUTS -eq 10 || $MINUTS -eq 5 ]];then
xmessage -center "Atencio, queden $MINUTS minuts." -timeout 10 &
fi
# DECREMENTAR EL CRÈDIT EN FUNCIÓ DE LA TARIFA, PER UN MINUT DE
# SESSIÓ
CREDIT=$(($CREDIT - $TARIFA))
# ACTUALITZAR LA BASE DE DADES (CRÈDIT I TEMPS DE SESSIÓ)
TEMPS=$TEMPS+1
$(mysql-query "UPDATE usuari SET credit=GREATEST(0,$CREDIT)
WHERE id_usuari=$DBUSERID;");
$(mysql-query "UPDATE sessio SET temps=$TEMPS WHERE
id_sessio=$SESSID;");
# ESPEREM UN MINUT
sleep 60;
# EN CAS DE NO TENIR CRÈDIT, BLOQUEJAR LA SESSIÓ.
while [[ $CREDIT -le 0 && ! $CLOSE_SESSION ]];do
$LOCKING_PROG
if [ $? == 1 ];then
CLOSE_SESSION=1;
fi
get_credit;
done
done
osd_err "Tancant la sessio de l'usuari '$USERNAME'."
# M'HE TROBAT QUE EN CONCRET EL 'killall' DE LA UBUNTU BREEZE NO TÉ LA
# OPCIÓ DEL "-u usuari", el 'killall' AMB EL QUE M'HAVIA BASAT PER
# MATAR TOTS ELS PROCESSOS DE L'USUARI D'UNA FORMA ELEGANT ERA AMB EL
# PAQUET psmisc VERSIÓ 22-1.1, UNA LLÀSTIMA...
#killall -u $USERNAME;
for proces in `ps -U $USERNAME -u $USERNAME h | cut -c -5`;do
kill -9 $proces;
done
#exit 0
fi
exit 0
Més informació sobre la llista de correu gilug