Люблю засыпать под радио с компьютера, поэтому возникла необходимость выключения оного по таймеру. Впечатывать с командной строки shutdown быстро надоело, к тому же, хочется чтобы и супруга овладела этим приёмом, так как мне с дивана вставать лень. Поэтому было решено написать скрипт для выключения компьютера с графическим диалоговым окном.
Для быстрого создания окна с диалогом есть утилитка zenity, которая тоже присутствует в Ubuntu по умолчанию. С её помощью можно создавать различные диалоговые окна. Мы сделаем такое:
Для начала нам нужно сделать возможным запуск shutdown от лица нашего пользователя без ввода пароля. Для этого воспользуемся утилитой sudo. В Ubuntu она уже установлена, в остальных дистрибутивах нужно установить пакет sudo. (Да, чтобы пользоваться командой sudo, пользователь должен быть в спецгруппе, обычно это wheel, adm, admin, sudoers, sudo и т.п.)
Добавим пользователю возможность запуска shutdown от имени суперпользователя без ввода пароля.
И добавим в открывшийся файл такие строки:
Вместо 'nuke' нужно вписать своего пользователя.
Для выключения компьютера будем использовать связку shutdown + at. Через команду shutdown можно сразу задавать время для выключения, но я хотел бы помимо самого выключения выполнять ещё кое-какие действия. Ну а через команду at будем задавать время для выключения, вернее, задержку перед выключением.
Создадим файл следующего содержания:
И сохраним его под именем poweroff, например, в домашней папке, в каталоге bin. Сделаем его исполняемым:
И добавим в тот же каталог bin файл power.job, в котором запишем действия для выключения компьютера, в нашем случае в этом файле одна строка:
Но можно туда дописать что-нибудь ещё. Например, я бы добавил туда правильное закрытие firefox, чтобы при следующем его запуске он не открывал мне окно с жалобой что его закрыли некорректно, но пока не придумал как.
Можно создать кнопку запуска на панели, для ярлычка я выбрал иконку из /usr/share/pixmaps/gnome-term-night.png (полагаю, она идёт в комплекте с X.org)

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

Для начала нам нужно сделать возможным запуск 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)

Напоследок поясню работу скрипта: задание можно отменять, при повторном выборе таймера старое задание заменяется новым. Остальное можно почерпнуть из комментариев и man'ов.