Pull to refresh

Простой GUI для выключения компьютера в Linux

Люблю засыпать под радио с компьютера, поэтому возникла необходимость выключения оного по таймеру. Впечатывать с командной строки shutdown быстро надоело, к тому же, хочется чтобы и супруга овладела этим приёмом, так как мне с дивана вставать лень. Поэтому было решено написать скрипт для выключения компьютера с графическим диалоговым окном.

Для быстрого создания окна с диалогом есть утилитка zenity, которая тоже присутствует в Ubuntu по умолчанию. С её помощью можно создавать различные диалоговые окна. Мы сделаем такое:image

Для начала нам нужно сделать возможным запуск shutdown от лица нашего пользователя без ввода пароля. Для этого воспользуемся утилитой sudo. В Ubuntu она уже установлена, в остальных дистрибутивах нужно установить пакет sudo. (Да, чтобы пользоваться командой sudo, пользователь должен быть в спецгруппе, обычно это wheel, adm, admin, sudoers, sudo и т.п.)

Добавим пользователю возможность запуска shutdown от имени суперпользователя без ввода пароля.
$ sudo visudo

И добавим в открывшийся файл такие строки:
# Cmnd alias specification
Cmnd_Alias SHUTDOWN = /sbin/shutdown
nuke ALL = NOPASSWD: SHUTDOWN

Вместо 'nuke' нужно вписать своего пользователя.

Для выключения компьютера будем использовать связку shutdown + at. Через команду shutdown можно сразу задавать время для выключения, но я хотел бы помимо самого выключения выполнять ещё кое-какие действия. Ну а через команду at будем задавать время для выключения, вернее, задержку перед выключением.

Создадим файл следующего содержания:
#! /bin/sh

# Задаём оболочку диалога
${DIALOG=zenity}

${JOBFILE=~/bin/power.job}

# Создаём временный файл для сохранения выбранного ответа
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$

# Просим стереть временный файл при выходе из программы
trap "rm -f $tempfile" 0 1 2 5 15

# Вызываем окно диалога
$DIALOG --list --radiolist \
--title "Выключение компьютера" --width=420 --height=470 \
--column="" \
--column="" \
--column="Через какое время выключить компьютер?" \
FALSE "5" "мин" \
FALSE "10" "мин" \
FALSE "15" "мин" \
FALSE "20" "мин" \
FALSE "25" "мин" \
FALSE "30" "мин" \
TRUE "35" "мин" \
FALSE "40" "мин" \
FALSE "45" "мин" \
FALSE "50" "мин" \
FALSE "55" "мин" \
FALSE "60" "мин" \
FALSE "90" "мин" \
FALSE "0" "Отменить (`atq -q c|wc -l` задач)" > $tempfile

# Код выхода $DIALOG
retval=$?

# Считываем из временного файла параметр, который мы выбрали (количество минут)
choice=`cat $tempfile`

# При нажатии на кнопку 'OK' retval равен 0
if [ $retval = "0" ]; then
# Для нашей задачи создадим очередь с именем 'c' (atq -q c)
if [ $choice = "0" ]; then
atrm `atq -q c|cut -f 1`
else
atrm `atq -q c|cut -f 1`
at -q c -f $JOBFILE now +$choice minutes
fi
fi


И сохраним его под именем poweroff, например, в домашней папке, в каталоге bin. Сделаем его исполняемым:
chmod a+x ~/bin/poweroff

И добавим в тот же каталог bin файл power.job, в котором запишем действия для выключения компьютера, в нашем случае в этом файле одна строка:
sudo shutdown -h now
Но можно туда дописать что-нибудь ещё. Например, я бы добавил туда правильное закрытие firefox, чтобы при следующем его запуске он не открывал мне окно с жалобой что его закрыли некорректно, но пока не придумал как.

Можно создать кнопку запуска на панели, для ярлычка я выбрал иконку из /usr/share/pixmaps/gnome-term-night.png (полагаю, она идёт в комплекте с X.org)
image

Напоследок поясню работу скрипта: задание можно отменять, при повторном выборе таймера старое задание заменяется новым. Остальное можно почерпнуть из комментариев и man'ов.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.