Я хочу написать скрипт bash для запуска таймера в течение 30 секунд, и через 30 секунд он должен удерживаться в течение следующих 30 секунд, и снова этот таймер начнется в течение следующих 30 секунд и продолжит то же самое.
for ((i=30; i>0; i--)); do
sleep 1 &
print "$i \r"
wait
done
Используя вышеприведенный код, я могу запустить таймер в течение 30 секунд, но мне нужно удерживать его в течение следующих 30 секунд и снова нужно запустить таймер в течение следующих 30 секунд.
How я могу это сделать?
То же самое я могу сделать это в java, используя этот код
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);
}
}
Заверните свою петлю в бесконечный цикл (т. е. цикл while без условий) и добавьте sleep 30 в этот внешний цикл.
while :
do
### < your
### timer
### here >
sleep 30
done
Я бы предложил вам также удалить wait и & из раздела "sleep 1 &". Кроме того, print не является подходящей программой для записи на терминал, вместо этого используйте echo.
while :
do
for ((i=30; i>0; i--))
do
sleep 1
echo -n "$i "
done
sleep 30
echo ""
done
Имейте в виду, что этот таймер не является точным, так как оценка инструкций цикла принимает (малый, но не ноль). Решение с использованием date было бы предпочтительным: см., Например, функцию обратного отсчета здесь: https://superuser.com/a/611582.
Заверните свою петлю в бесконечный цикл (т. е. цикл while без условий) и добавьте sleep 30 в этот внешний цикл.
while :
do
### < your
### timer
### here >
sleep 30
done
Я бы предложил вам также удалить wait и & из раздела "sleep 1 &". Кроме того, print не является подходящей программой для записи на терминал, вместо этого используйте echo.
while :
do
for ((i=30; i>0; i--))
do
sleep 1
echo -n "$i "
done
sleep 30
echo ""
done
Имейте в виду, что этот таймер не является точным, так как оценка инструкций цикла принимает (малый, но не ноль). Решение с использованием date было бы предпочтительным: см., Например, функцию обратного отсчета здесь: https://superuser.com/a/611582.
Заверните свою петлю в бесконечный цикл (т. е. цикл while без условий) и добавьте sleep 30 в этот внешний цикл.
while :
do
### < your
### timer
### here >
sleep 30
done
Я бы предложил вам также удалить wait и & из раздела "sleep 1 &". Кроме того, print не является подходящей программой для записи на терминал, вместо этого используйте echo.
while :
do
for ((i=30; i>0; i--))
do
sleep 1
echo -n "$i "
done
sleep 30
echo ""
done
Имейте в виду, что этот таймер не является точным, так как оценка инструкций цикла принимает (малый, но не ноль). Решение с использованием date было бы предпочтительным: см., Например, функцию обратного отсчета здесь: https://superuser.com/a/611582.
Я думаю, что вы ищете что-то вроде этого:
#!/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
В качестве альтернативы используйте 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
Для еще большей точности не храните date в переменной:
#!/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
Я думаю, что вы ищете что-то вроде этого:
#!/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
В качестве альтернативы используйте 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
Для еще большей точности не храните date в переменной:
#!/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
Я думаю, что вы ищете что-то вроде этого:
#!/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
В качестве альтернативы используйте 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
Для еще большей точности не храните date в переменной:
#!/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