guión de bash para el temporizador -- mmand-line campo con bash campo con scripts campo con time camp askubuntu Relacionados El problema

bash script for timer


1
vote

problema

Español

Quiero escribir un script de bash para ejecutar un temporizador durante 30 segundos y, después de 30 segundos, debe mantenerse para los próximos 30 segundos y nuevamente, ese temporizador comenzará para los próximos 30 segundos y continuará igual.

  for ((i=30; i>0; i--)); do    sleep 1 &    print "$i  "    wait done   

Uso del código anterior, puedo ejecutar el temporizador para 30 segundos, pero necesito mantener en los próximos 30 segundos y, nuevamente, debe ejecutar el temporizador durante los próximos 30 segundos.

¿Cómo puedo hacer esto?

Lo mismo que puedo hacerlo en Java usando este código

  import java.util.Timer; import java.util.TimerTask; public class TestClass {     static int count = 0;     public static void main(String[] args)  {         final TestClass test = new TestClass();                 Timer timer = new Timer();                 timer.schedule(new TimerTask() {                     @Override                     public void run() {                         test.doStuff();                       }                 }, 0, 1000);     }     public void doStuff() {         if (count == 30) {             try {                 Thread.sleep(30000);                 count = 0;             } catch (InterruptedException e) {                 e.printStackTrace();             }         }         System.out.println(++count);     } }   
Original en ingles

I want to write a bash script to run a timer for 30 seconds and, after 30 seconds, it should hold for the next 30 seconds and again that timer will start for next 30 seconds and continue the same.

for ((i=30; i>0; i--)); do    sleep 1 &    print "$i \r"    wait done 

Using the code above, I can run the timer for 30seconds, but I need to hold for the next 30 seconds and again need to run the timer for the next 30 seconds.

How can I do this?

same thing I can do it in java using this code

import java.util.Timer; import java.util.TimerTask; public class TestClass { xe2x80x82xe2x80x82xe2x80x82xe2x80x82static int count = 0; xe2x80x82xe2x80x82xe2x80x82xe2x80x82public static void main(String[] args)xe2x80x82xe2x80x82{ xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82final TestClass test = new TestClass(); xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82Timer timer = new Timer(); xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82timer.schedule(new TimerTask() { xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82@Override xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82public void run() { xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82test.doStuff();                       } xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82}, 0, 1000); xe2x80x82xe2x80x82xe2x80x82xe2x80x82} xe2x80x82xe2x80x82xe2x80x82xe2x80x82public void doStuff() { xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82if (count == 30) { xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82try { xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82Thread.sleep(30000); xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82count = 0; xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82} catch (InterruptedException e) { xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82e.printStackTrace(); xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82} xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82} xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82xe2x80x82System.out.println(++count); xe2x80x82xe2x80x82xe2x80x82xe2x80x82} } 
           
   
   

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Envuelva su bucle en un bucle infinito ( es decir, a while bucle sin condiciones), y agregue un sleep 30 en este bucle externo. < / p>

  while : do     ###  < your     ###   timer     ###   here >     sleep 30 done   

Le sugiero que también elimine la instrucción wait y el & de " sleep 1 & ". Además, ABCDEFGHIJKLMNABCDEFGHIJKLMN8 no es el programa adecuado para escribir en el terminal, use echo en su lugar.

  ls0  

Tenga en cuenta que este temporizador no es preciso, ya que la evaluación de las instrucciones de bucle requiere una cantidad de tiempo (pequeña, pero no cero). Una solución que usa ls1 sería preferible: consulte, por ejemplo, la función de cuenta regresiva aquí: https://superuser.com/a / 611582 .

 

Wrap your loop into an infinite loop (i.e. a while loop without conditions), and add a sleep 30 in this outer loop.

while : do     ###  < your     ###   timer     ###   here >     sleep 30 done 

I'd suggest you also remove the wait instruction and the & from "sleep 1 &". Also, print is not the right program to write to the terminal, use echo instead.

while : do     for ((i=30; i>0; i--))     do        sleep 1         echo -n "$i "     done     sleep 30     echo "" done 

Be aware that this timer is not accurate as evaluating the loop instructions takes a (small, but non zero) amount of time. A solution using date would be preferable: see for example the countdown function here: https://superuser.com/a/611582.

 
 
1
 
vote

Creo que estás buscando algo como esto:

  ls2  

Alternativamente, use ls3 :

  ls4  

Para una precisión aún mayor, no almacene la fecha en una variable:

  ls5  
 

I think you are looking for something like this:

#!/bin/bash  ## Infinite loop while :; do         ## Run a sleep command for 30 seconds in the background         sleep 30 &         ## $! is the PID of the last backgrounded process, so of the sleep.         ## Wait for it to finish.         c=30         while [[ -e /proc/$! ]]; do                 printf '%s\r' "$(( --c ))"                 ## For more precision, comment the line below. This causes the                 ## script to wait for a second so it doesn't spam your CPU.                 ## If you need accuracy, comment the line out. Although, if you                 ## really need accuracy, don't use the shell for this.                 sleep 1         done done 

Alternatively, use date:

#!/bin/bash waitTime=30; ## Infinite loop while :; do         startTime=$(date +%s)         currentTime=$(date +%s)         c=$waitTime;         while [[ $((currentTime - startTime)) -lt $waitTime ]]; do                 printf '%s\r' "$(( --c ))"                   ## For more precision, comment the line below. This causes the                 ## script to wait for a second so it doesn't spam your CPU.                 ## If you need accuracy, comment the line out. Although, if you                 ## really need accuracy, don't use the shell for this.                 sleep 1                 currentTime=$(date +%s)         done         c=0         echo ""; done 

For even greater precision, don't store the date in a variable:

#!/bin/bash waitTime=4; while :; do         startTime=$(date +%s)         c=$waitTime;         while [[ $(($(date +%s) - startTime))  -lt $waitTime ]]; do                 printf '%s\r' "$(( --c ))"                   sleep 1         done         c=0 done 
 
 

Relacionados problema

0  ¿Hay un reloj de alarma / temporizador para Ubuntu 13.10?  ( Is there an alarm clock timer for ubuntu 13 10 ) 
Me gustaría usar un temporizador / bloqueo de alarma para Ubuntu 13.10, que aparece junto a o dentro del menú de gotón del reloj en el panel superior. Lo in...

1  Arreglo o reinicio "Fecha y hora automática" en Ubuntu 18.10 en la computadora portátil XPS 9570  ( Fix or reset automatic date time in ubuntu 18 10 on xps 9570 laptop ) 
Tengo un problema en el que la fecha y la hora están incorrectamente incorrectamente cuando utilizo la fecha y el amplificador automático; Tiempo en la config...

1  Haga que el registro diario gire la ejecución exacta  ( Make the daily log rotate run on exact time ) 
Tengo Ubuntu 12.04.2 LTS Server. Mis rotaciones de registro diario que se enumeran en /etc/logrotate.d/ se ejecutan a la mañana alrededor de las 7:00 am, ...

7  El reloj deja de hacer tictac cuando está inactivo, causando deriva  ( Clock stops ticking when inactive causing drift ) 
El applet de reloj se desvía en el tiempo. El reloj se establece en "Sincronizar con Internet ...", por lo que es correcto en la puesta en marcha, pero luego,...

3  No se puede coordinar la hora correcta entre el sistema y la RTCWAKE  ( Cant coordinate the correct time between system and rtcwake ) 
El objetivo final es que mi sistema se apague al final de un script y se despierta a una hora definida al día siguiente. Estoy usando ABCDEFGHIJKLMNABCDEFGHI...

3  El tiempo del sistema sigue reiniciándose a UTC [duplicado]  ( System time keeps resetting to utc ) 
Esta pregunta ya tiene respuestas aquí : El tiempo de reloj está apagado en la bota dual ...

153  ¿Cuál es el comando para actualizar la hora y la fecha de Internet?  ( What is the command to update time and date from internet ) 
¿Cuál es el comando para actualizar la hora y la fecha de Internet? ¿Hay alguna aplicación que me permita hacerlo de su interfaz de usuario en lugar de de la ...

3  ¿Cómo puedo matar una solicitud después de una cantidad específica de tiempo? [duplicar]  ( How can i kill an application after a specific amount of time ) 
Esta pregunta ya tiene respuestas aquí : Cerrado 8 años . posible duplicado: ¡Aplicación d...

1  Bota con E4RAT de repente toma 20 segundos por más tiempo  ( Boot with e4rat suddenly takes 20sec longer ) 
Hace un par de días, configuré E4RAT para mi Ubuntu 14.04 corriendo en un Lenovo IdeaPad U330. Los primeros días que realmente hizo maravillas, básicamente co...

256  Cómo cambiar la configuración de la zona horaria de la línea de comandos  ( How to change time zone settings from the command line ) 
Tengo una máquina virtual que se establece en PST que un par de colegas tienen en diferentes zonas de tiempo. Si quería cambiar la zona horaria a est y ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos