Buenas tardes a todos,
Creé una herramienta de monitoreo de recursos que funciona bastante bien.
Sin embargo, tengo un problema con mi script. La parte del código con el que estoy experimentando mi problema se encuentra a continuación (convertí algunos a pseudocódigo para simplificar).
COUNT=1 read -rsp "When you are ready to begin, please press any key" -n1 echo "processing" sleep 3 while [ ${COUNT} = "1" ; do read -t 1 -n 1 if [$? = 0 ] ; then exit 0 else `Resource command` > ${cpulog} file for future graphs `Resource command` > ${memlog} file for future graphs `Resource command` > ${network} log file for future graphs `etc` fi doneBásicamente, presiona cualquier tecla para iniciar el programa, y cada vez que presiona cualquier tecla en el teclado después de que el programa haya comenzado (bucle Mientras), el programa deja de grabar información y continúa.
Ahora este script funciona y hace todo lo que necesito que haga. El problema con el que me he encontrado es cuando "presionas cualquier tecla" .
Tenga en cuenta que hay dos puntos en la secuencia de comandos que esperan la pulsación de una tecla.
Si tuviera que presionar cualquier tecla más de una vez en el primer punto, la entrada de la segunda tecla sería procesada por mi comando read -t 1 -n 1 (en el segundo punto) y, por lo tanto, no podría ejecutar mis extracciones de recursos. Dado que eso sucede de inmediato, el script falla.
Básicamente, estoy tratando de averiguar si hay una manera de cerrar la entrada después de ese primer golpe de tecla por un tiempo limitado mientras recupero una cantidad limitada de datos, o vaciar cualquier entrada que se proporcionó antes de presionar mi read -t 1 dominio. Gracias.
El script puede llamar a un pequeño programa, escrito en C, perl o similar, que llama a FIONREAD ioctl en stdin.
Luego, lea los caracteres adicionales inesperados que se eliminarán con una llamada de lectura; consulte el libro de recetas de Perl para determinar los bytes no leídos . De hecho, puede ingresar el código perl en la línea de comando con perl -e. para mantenerlo todo dentro del script bash.
En la "línea de procesamiento", agregue el siguiente bucle:
# Eat any remaining input while read -t 1 -n 1 do # Do nothing here : done # Continue processing now that all input has been consumed...Agregará aproximadamente 1 segundo de retraso al inicio (más si el usuario está sentado allí presionando las teclas), pero de lo contrario hace lo que quiere.