LINUX.ORG.RU

Скелет передачи сигналов в функцию

 


0

1

Выделю отдельной темой: Нужен stopwatch на bash т.к лучше отдельно обсудить функционал передачи сигналов

Необходимо передавать в функцию bash сигналы вида:

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

Чтобы можно было написать stopwatch с функцией паузы и отдачи статики. Чатжпт такое выдал:

# Инициализация состояния
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=$!
echo ${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

Естественно, такое работать не будет т.к pid постоянно разный будет

★★★★

Последнее исправление: bryak (всего исправлений: 1)

Естественно, такое работать не будет т.к pid постоянно разный будет

Так вы сами должны для начала решить, как ваша новая команда будет узнавать, какую задачу вы придумали сейчас в данный момент контролировать.

vodz ★★★★★
()

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

legolegs ★★★★★
()

Используй файл (не на диске, а в памяти tmpfs/shm) где будешь хранить pid. Если файла нет, то скрипт стартует как демон, и пишет свой pid в файл. Сам скрипт обрабатывает SIGчто-то-там для каждого из случаев. Повторный запуск скрипта с ключами проверяет, есть ли файл с pid если есть проверяет pid вообще живой, если живой проверяет а ты точно режиссёр это и есть этот же самый скрипт, если ответы на всё да, да, да то скрипт шлёт SIGчто-то-там своей демонизированной копии, выдаёт выхлоп если тот есть и завершается. Таким образом у тебя один и тот же скрипт будучи запущенным первый раз становится демоном, будучи запущенным сколько угодно раз покуда работает первый инстанс становится интерфейсом к демону.

Задача в наладке межпроцессного взаимодействия, и организации lock файла, а им будет и будет являться тот самый файлик с pid первого запущенного процесса. pid можно и не хранить, но придётся сделать хак, имя процесса первого должно быть настолько уникальным что кабзда, для этого можно чтобы если в процессах такого имени нет, текущий скрипт копировал сам себя в файл с уникальным именем и запускал его, после чего отмирал, повторые запуски будут проверять наличие в процессах уникального имени процесса и уже извлекать pid, так можно обойтись без lock файла и сохранения pid. Или можно просто запускаться получать свой пид, и искать процесс с тем же именем что у тебя но другим pid, может быть только пара процессов с одним именем, если более двух то всё должно падать нахрен. Но в любом случае нужно демонизировать первый запуск и наладить межпроцессную коммуникацию, а тут вариантов много, как удобнее так и делай

Как-то так.

LINUX-ORG-RU ★★★★★
()