Скрипт блокировки сеанса в Linux

В этой статье я продемонстрирую вам скрипт блокировки сеанса в 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 блокируем сеанс.

Приведу здесь дополнительные команды, с помощью которых вы также можете блокировать сеанс, но эти команды зависят от графического окружения:

  • Если у вас cinnamoncinnamon-screensaver-command -l.
  • Если у вас xfce4xflock4.

Но команда loginctl lock-session — более универсальная, она работает во всех системах под управлением SystemD.


По желанию вы можете отредактировать мой скрипт блокировки сеанса для Linux, и выполнять другое действие по таймеру.

Другие мои статьи по программированию на Bash вы можете найти здесь.

Если понравилась статья, подпишись на мой канал в VK или Telegram.

Оставьте комментарий