Aqui está um script para emular o comportamento desejado. Deve ser executado como com sudo
. Pode ser ligado a um atalho de teclado (com adição preliminar do comando shutdown
ao arquivo sudoers para permitir a execução sem senha ). Simplista, conciso e faz o trabalho.
#!/bin/bash
# Date: June 11,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog
# Tell ubuntu to shutdown in 1 min
shutdown -P +1 &
# Show the dialog
zenity --question --text="Shutdown now ? Automatic shutdown in 60 seconds" --ok-label="DOIT"
# If user clicks DOIT, then cancel the old
# shutdown call that has countdown,
# (because only one shutdown command can be run at a time), and
# tell ubuntu to shutdown immediately
# otherwise - cancel it
if [ $? -eq 0 ];then
shutdown -c
shutdown -P now
else
shutdown -c
fi
Atualização: 14 de junho
Como sugerido por Takkat, aqui está um script que utiliza a opção --timer do zenity e dbus para obter o mesmo comportamento sem necessidade de acesso ao sudo:
#!/bin/bash
# Date: June 14,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog
# version #2
zenity --question --text="Shutdown now ? Autoshutdown in 60 seconds" \
--cancel-label="DOIT" --ok-label="NOPE" --timeout=60 ||
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
A ideia básica aqui é que a opção de tempo limite do zenity sai com um código maior que 0, o que normalmente significa que o comando falhou. Portanto, ao tratar a opção de cancelamento e o tempo limite do zenity como a condição que permitirá o encerramento, usamos o operador OR ( ||
) para desligar apenas se o usuário clicar no botão cancelar (rotulado como "DOIT") ou o tempo limite da caixa de diálogo.
Outra variação para melhorar a experiência do usuário pode ser feita com yad
(precisa ser instalado primeiro com esses comandos sudo apt-add-repository ppa:webupd8team/y-ppa-manager;sudo apt-get update; sudo apg-get install yad
). Esta variação usa a barra de progresso para permitir que o usuário saiba quanto tempo resta
#!/bin/bash
yad --auto-close --sticky --on-top --skip-taskbar --center \
--text 'Shutdown now ? Autoshutdown in 60 seconds.' \
--button="gtk-ok:1" --button="gtk-close:0" --image=dialog-question \
--title 'Shutdown' --timeout=60 --timeout-indicator=top ||
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
Outra versão possível, leva em consideração que, se você alterar o rótulo do botão ok do zenity, o botão destacado por padrão pode ou não ser o botão ok.
zenity --question --timeout 10 --text="Automatic shutdown in 10 seconds"
if [[ $? -eq 1 ]] ; then
# user clicked Cancel
exit
else
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
fi
O script desliga o sistema em qualquer retorno que não seja 0. Se o tempo limite do script expirar, o valor de retorno de 1 ou 5 informará ao script para executar a else
part