В этой статье я продемонстрирую вам скрипт блокировки сеанса в Linux. Который через заданный промежуток времени блокирует ваш сеанс на компьютере под управлением Linux с графической средой. Я проверял этот скрипт на Debian 12 XFCE и Linux Mint Cinnamon. Мне понадобилось такое решение для ограничения проведенного времени за компьютером ребёнком. То-есть я пускаю ребёнка за компьютер, запускаю скрипт, и через некоторое время сеанс блокируется. Вы же можете подправить скрипт под свои задачи, когда по таймеру будет совершаться какое-то другое действие.
Скрипт
Данный скрипт должен работать на всех системах Linux c системой инициализации SystemD. Так как для блокировки сеанса используется команда loginctl lock-session
.
Также в скрипте используется команда notify-send
. Она является частью пакета libnotify и использует сервис уведомлений D-Bus. Она работает в большинстве популярных окружений рабочего стола, таких как:
- GNOME
- KDE Plasma
- XFCE
- Cinnamon
- MATE
Но не работает в небольших графических окружения (i3, Openbox, AwesomeWM).
Для начала представляю вам весь скрипт целиком. Он хорошо прокомментирован и, возможно, вы поймете его работу сразу. А для тех, кто только учится писать скрипты, ниже я опишу его подробнее.
Скрипт timer-lock.sh:
DELAY=${1:-600} # Лог-файл LOGFILE="timer-lock.log" # Сообщение о запуске notify-send "Скрипт запущен. Блокировка сеанса произойдёт через $((DELAY / 60)) минут." echo "$(date): Скрипт запущен. Задержка: $DELAY секунд." >> $LOGFILE # Уход в фон: ожидание и уведомления ( for PERCENT in {10..100..10}; do # Рассчитываем время для текущего процента TIME=$((DELAY * PERCENT / 100)) # Ждём до текущего процента времени sleep $((TIME - ${LAST_TIME:-0})) LAST_TIME=$TIME # Уведомление if [ "$PERCENT" -lt 100 ]; then REMAINING_TIME=$((DELAY - TIME)) echo "$(date): Прошло $PERCENT% времени задержки. Осталось $REMAINING_TIME секунд." >> $LOGFILE notify-send "Уведомление" "Прошло $PERCENT% времени задержки. Осталось $REMAINING_TIME секунд." else # Блокировка сеанса на 100% echo "$(date): Блокировка сеанса!" >> $LOGFILE #cinnamon-screensaver-command -l #xflock4 loginctl lock-session fi done ) &
Разбор скрипта
DELAY=${1:-600}
Переменная DELAY — это задержка в секундах, но оформленная интересным способом. Если запустить скрипт без параметров, то значение будет взято то, которое указано после :-, то есть 600. Но можно при запуске скрипта указать другое значение, например так ./timer-loc.sh 1200
.
LOGFILE="timer-lock.log"
Переменная LOGFILE указывает на файл лога.
notify-send "Скрипт запущен. Блокировка сеанса произойдёт через $((DELAY / 60)) минут." echo "$(date): Скрипт запущен. Задержка: $DELAY секунд." >> $LOGFILE
С помощью notify-send
мы выводим уведомление на рабочий стол. А с помощью конструкции $((DELAY / 60))
переводим секунды в минуты. Затем, с помощью конструкции echo текст >> файл
, записываем в лог-файл сообщение о том что скрипт запустился. Конструкция $(date)
подставляет текущую дату и время.
Затем скрипт уходит в фон, для этого используем конструкцию:
( код скрипта ) &
Для теста, можете попробовать вот такой скрипт:
echo "Скрипт запущен" ( sleep 10 echo "Скрипт завершён" )&
Затем, в фоне запускается цикл:
for PERCENT in {10..100..10}; do done
При этом переменная PERCENT принимает значения от 10 до 100 с шагом 10. Для проверки, можете попробовать такой скрипт:
for PERCENT in {10..100..10}; do echo "Прошло $PERCENT% времени" done
В цикле мы рассчитываем время для текущего процента:
TIME=$((DELAY * PERCENT / 100))
Если взять DELAY=600, то для 10% оно будет 60. Это первая итерация.
Затем скрипт ждёт рассчитанное выше время sleep $((TIME - ${LAST_TIME:-0}))
. Переменная LAST_TIME по умолчанию равна 0. То есть скрипт ждёт 60 секунд. Следующим шагом LAST_TIME уже меняется — LAST_TIME=$TIME
. Так что на следующей итерации цикла, оно будет другим.
Затем (мы всё ещё в цикле) запускается ветвление if [ "$PERCENT" -lt 100 ]; then
. Что означает, если время ещё не вышло (не 100%), то выполняем следующий код:
REMAINING_TIME=$((DELAY - TIME)) echo "$(date): Прошло $PERCENT% времени задержки. Осталось $REMAINING_TIME секунд." >> $LOGFILE notify-send "Уведомление" "Прошло $PERCENT% времени задержки. Осталось $REMAINING_TIME секунд."
REMAINING_TIME — время которое осталось. На первой итерации: задержка 600 — прошедшее время 60, значит REMAINING_TIME=540.
Затем выполняется запись в лог (echo), и выводится уведомление (notify-send).
На второй итерации — если DELAY=600, то для 20% => TIME=120. Скрипт высчитывает время ожидания: sleep $((TIME - ${LAST_TIME:-0}))
. Здесь LAST_TIME уже равен 60, ведь мы его изменили на первой итерации. То есть скрипт ждёт (sleep) 120 — 60 = 60 секунд.
И так продолжается пока мы не дойдём до 100%. Как только мы дошли до 100%, мы выполняем следующий блок кода:
echo "$(date): Блокировка сеанса!" >> $LOGFILE #cinnamon-screensaver-command -l #xflock4 loginctl lock-session
С помощью echo заносим запись в лог-файл. А с помощью loginctl lock-session блокируем сеанс.
Приведу здесь дополнительные команды, с помощью которых вы также можете блокировать сеанс, но эти команды зависят от графического окружения:
- Если у вас cinnamon —
cinnamon-screensaver-command -l
. - Если у вас xfce4 —
xflock4
.
Но команда loginctl lock-session
— более универсальная, она работает во всех системах под управлением SystemD.
По желанию вы можете отредактировать мой скрипт блокировки сеанса для Linux, и выполнять другое действие по таймеру.
Другие мои статьи по программированию на Bash вы можете найти здесь.
Если понравилась статья, подпишись на мой канал в VK или Telegram.