Как стать автором
Обновить

Простой 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'ов.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.