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

У меня есть следующий бесконечный цикл в bash, выполняющий do_some_simple_job каждые 10 минут:

 while true do do_some_simple_job sleep 600 done 

Я бы хотел, чтобы сценарий принимал некоторые нажатия клавиш во время выполнения этой задачи, например, для отмены задания, но не для завершения скрипта, возможно ли это?

One Solution collect form web for “Bash – сделать бесконечную работу, ожидая нажатия определенной клавиши – возможно?”

Да, это возможно.

 #!/bin/sh sigint_handler () { echo "Killing the job ($job_pid)" kill $job_pid } while true; do some_simple_job & job_pid=$! trap 'sigint_handler' INT echo "Job started ($job_pid)" wait trap - INT echo "Job finished, waiting 10 minutes..." sleep 600 done 

Этот скрипт sh (также работает в bash , ksh93 и других совместимых оболочках) содержит ваш бесконечный цикл. После запуска задания в фоновом режиме он устанавливает обработчик сигналов , небольшую подпрограмму, которая должна запускаться всякий раз, когда скрипт ловит определенный сигнал. Сигналом, который он ловит, является сигнал INT (прерывание), который вы посылаете, нажав Ctrl + C.

Сценарий ожидает завершения задания, затем он спит в течение 10 минут (как это делает ваш скрипт). Перед тем, как он спит, он удалит обработчик сигнала, чтобы вы могли прервать скрипт с помощью Ctrl + C.

Если во время выполнения задания поступает сигнал INT , обработчик сигнала убьет задание с помощью идентификатора процесса. Затем скрипт будет выполнен для удаления обработчика и сна.

Если вы не выходите из сценария в течение 10 минут сна, цикл продолжается с запуском задания и установкой обработчика снова.

  • Перенаправить ввод в несколько разных файлов вывода
  • awk в ssh в su в подстановке команд
  • Перемещение подкаталога в новый родительский каталог, где новое имя каталога увеличивается на 1
  • Как использовать If-Else для выполнения определенных действий, если дни недели - это дни?
  • значение переменной оболочки для цикла, отличного от цикла
  • Как подождать по программе, запущенной в другой оболочке
  • Как получить имя ближайшей интерактивной оболочки предка из сценария?
  • Как удалить привилегии root в сценариях оболочки?
  • Как быстро сканировать беспроводные сети
  • Извлечь определенный текст из переменной в сценарии оболочки
  • Два IP-адреса на одном интерфейсе, узнайте, какой из них используется
  • Самый изящный способ прекратить навязчивую программу
  • Interesting Posts

    Как я могу предотвратить перезагрузку systemctl или выключение системы systemctl?

    Как я могу использовать grep для отображения строк БЕЗ любой из двух конкретных строк?

    Нельзя подписывать / шифровать, если я не запускаю gpg-agent вручную

    Что делают скрипты в файле /etc/profile.d?

    изменить последние 10 символов базы (не расширение) нескольких файлов

    установка на загрузку – как редактировать

    Как я могу помешать Meta открыть панель запуска KDE Plasma?

    UFW: разрешить трафик только с динамического IP на последних двух элементах

    Блокируйте все устройства при настройке громкости пульсового звука в kmix

    Изменение цвета и тени шрифта из заголовка в диспетчере окон

    Пакетная обработка многих файлов

    Как получить числа, используя регулярное выражение, но только последнее

    Как я могу увидеть, какой менеджер пакетов запущен?

    Ошибка OpenVPN systemd, но работает

    Внедрение шифров eSTREAM?

    Linux и Unix - лучшая ОС в мире.