LINUX.ORG.RU

Нужен stopwatch на bash

 


0

2

Разыскивается нормальный stopwatch на bash, который умеет следующее:

  1. ./stopwatch.sh start 15, где 15 - минуты
  2. ./stopwatch.sh stop
  3. ./stopwatch.sh pause
  4. ./stopwatch.sh stat

Чтобы можно было устанавливать кол-во минут и оно в фоне тикало. Статистику забирать по stat. В конце оно могло играть оповещение и запускать notify-send. По команде stat - отдавало кол-во оставшихся минут и секунд

Если не найдется - надо будет самому делать и реализация этого вполне ясна и понятна, за исключением реализации управления основной функцией. Типа:

base_func() {
while True:
    тут мы ловим сигналы start stop pause stat и запускаем вспомогательные функции
}

while True:
    тут мы ловим аргументы командной строки и передаем их в base_func

Нагуглить это не получилось

UPD: не надо решений для DE и на других ЯП

★★★★

Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от unDEFER

Ну можно и без него, но надо как-то сигналы в base_func передавать. gpt генерит такую фигню, она похоже на что-то архитектурно похожее, но не работает конечно же

# Инициализация состояния
state="stopped"

# Функция, которая выполняется в цикле
run_function() {
    while true; do
        case "$state" in
            running)
                echo "Функция выполняется..."
                sleep 1  # Имитация работы
                ;;
            paused)
                echo "Функция приостановлена. Ожидание команды..."
                sleep 1
                ;;
            stopped)
                echo "Функция остановлена."
                break
                ;;
        esac
    done
}

# Запуск функции в фоновом режиме
run_function &

# Получение PID фонового процесса
pid=$!

# Обработка аргументов
while true; do
    case "$1" in
        start)
            state="running"
            echo "Запуск функции..."
            ;;
        stop)
            state="stopped"
            echo "Остановка функции..."
            break
            ;;
        pause)
            state="paused"
            echo "Приостановка функции..."
            ;;
        resume)
            state="running"
            echo "Возобновление функции..."
            ;;
        *)
            echo "Использование: $0 {start|stop|pause|resume}"
            exit 1
            ;;
    esac
    shift
done

# Ожидание завершения фонового процесса
wait $pid

Думал сигналы передавать через замыкания с сохранением состояния, но баш этого не поддерживает

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

Можно вообще без каких-либо сигналов реализовать - пишете в файл таймстемп окончания, при паузе добавляете таймстемп начала паузы, при отжатии паузы разницу текущего таймстемпа и второго таймстемпа прибавляете к первому.

Добавляете демон, который ждёт истечения времени, проверяет не изменился ли таймстемп (действительно ли текущий таймстемп стал не меньше записанного) и не добавился ли второй и выполняет что вам там нужно.

unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 2)