Intereting Posts
Как получить все строки между первым и последним вхождениями шаблонов? Как скрыть определенный процесс? Оболочка: сравнить содержимое файла, а не контрольные суммы Метод Cross Linux для обнаружения заставки или заблокированного экрана Как изменить размер изображения на текстовое содержимое? идентифицировать недостающие файлы в папке Я пытаюсь открыть порт 19132 на моем сервере Ubuntu, но не работает WiFi Broadcom 4306 не будет подключаться Linux У меня 2 адаптера WIFI каждый раз при загрузке они переключали друг друга на wlan0 и wlan1 Каков был общий рабочий процесс для поиска / обнаружения / редактирования файлов проекта в VI (M) перед виртуальными терминалами? Можно ли переименовать учетную запись Unix? Ansible: не удалось пропинговать контейнер linux Можно ли добавить поддержку CP-1252 для CentOS? Измерьте время выполнения команды, включая расширение подстановки команд настройка SSH обратного туннеля

Если команда достижения таймаута выполняет другую команду

Я пытаюсь настроить сценарий для компьютера моей школы, который автоматически отключает их в конце дня (так как большинство учителей забыли их).

Я решил отправить предупреждающее поле zenify, чтобы сообщить пользователю, что ПК выключится, и если пользователь не подтвердит через 1 минуту, ПК выключится.

Я знаю существование команды тайм-аута, но в этом случае я хочу вызвать sudo shutdown -h now если команда zenity не вернется через 60 секунд.

Я пытался сделать что-то вроде

timeout 60 --onTimeout="sudo shutdown -h now" zenity --warning --text="This PC is going to shut down in a minute if you DO NOT press the OK button."

Команда будет выполнена в cron-скрипте.

Итак, возникает вопрос : как я могу выполнить команду при тайм-ауте программы zenity?

Вам нужно будет проверить статус выхода и принять решение на основе этого. В руководстве по тайм-ауту GNU говорится, что

Если команда отключена, а -preserve-status не установлен, выйдите со статусом 124.

Итак, в сценарии оболочки вы бы сделали что-то вроде этого:

 timeout 60 zenity ... if [ $? = 124 ] ; then echo it timed out, do something... else echo didn't time out fi 

Хотя, похоже, что zenity поддерживает тайм-аут сам по себе , поэтому вам не нужен внешний тайм-аут:

 zenity --timeout 60 --warning --text="Shutdown in 60" if [ $? = 5 ] ; then sudo shutdown -h now fi 

Даже если использовать тайм-аут Zenity, он, похоже, не показывает оставшееся время. Тем не менее, он имеет режим выполнения, который может использоваться для передачи чувства надвигающейся гибели. Что-то вроде этого будет отображать таймер, отсчитывающий от 60 с одновременным заполнением индикатора выполнения:

 #!/bin/bash timeout=60 for (( i=0 ; i <= $timeout ; i++ )) do echo "# Shutdown in $[ $timeout - $i ]..." echo $[ 100 * $i / $timeout ] sleep 1 done | zenity --progress --title="Shutting down automatically..." \ --window-icon=warning --width=400 --auto-close if [ $? = 0 ] ; then echo timeout passed else echo cancel was pressed or zenity failed somehow fi - #!/bin/bash timeout=60 for (( i=0 ; i <= $timeout ; i++ )) do echo "# Shutdown in $[ $timeout - $i ]..." echo $[ 100 * $i / $timeout ] sleep 1 done | zenity --progress --title="Shutting down automatically..." \ --window-icon=warning --width=400 --auto-close if [ $? = 0 ] ; then echo timeout passed else echo cancel was pressed or zenity failed somehow fi