Diretamente do manual do systemd-suspend.service :
Immediately before entering system suspend and/or hibernation systemd-suspend.service (and the other mentioned units, respectively) will run all executables in /usr/lib/systemd/system-sleep/ and pass two arguments to them. The first argument will be "pre", the second either "suspend", "hibernate", or "hybrid-sleep" depending on the chosen action. Immediately after leaving system suspend and/or hibernation the same executables are run, but the first argument is now "post". All executables in this directory are executed in parallel, and execution of the action is not continued until all executables have finished.
Eu fiz alguns testes, e descobri que se você colocar um script (marcado como executável por todos, que pode ser obtido com chmod a+x
) em /lib/systemd/system-sleep
, sem o / usr , será executado conforme mencionado.
No entanto , há uma desvantagem que é o que faz você pensar que não está funcionando: o ambiente é diferente. Comandos gráficos não funcionam . Provavelmente há uma maneira de contornar isso, mas por padrão, unity --replace
falhará porque não pode se conectar ao servidor X (e, portanto, nenhum comando que não funcione se você pressionar CTRL-ALT -F1 e entrar em um console real sem adulteração funcionará).
Ok, acabei de interromper minha digitação para fazer alguma pesquisa: depois de examinar o wiki básico de chroot (porque eu ve tinha o mesmo problema em chroots), descobri que se você chama manualmente xhost +
antes de suspensão, os comandos gráficos (no meu caso zenity --info --text "1:$1 2:$1"
) funcionam corretamente. No entanto, você não pode chamar xhost +
do script. O que você pode fazer é adicionar um programa aos "aplicativos de inicialização" para chamar automaticamente xhost +
quando você efetuar login (adicione-o lá e não a .bashrc
, porque se adicionado a .bashrc
ele será executar toda vez que você abrir um emulador de terminal). Pode ser diferente no Unity, mas no Ubuntu MATE eu posso ir para System → Preferences → Personal → Startup Applications
e clicar em Add para fazer isso.
Em seguida, crie um arquivo /lib/systemd/system-sleep/restart-unity
com o seguinte conteúdo:
#!/bin/bash
export DISPLAY=:0
if [[ "$1" == "post" && "$2" == "suspend" ]]
then
sleep 5
unity --replace
fi
e execute sudo chmod a+x /lib/systemd/system-sleep/restart-unity
(certifique-se de que o arquivo é de propriedade root e só pode ser escrito por root).
Note que deve usar bash
. Isso é por causa da instrução "if". Quando tentei a instrução manualmente em sh
, recebi vários erros da parte &&
.
O sleep
está lá porque sem ele, unity --replace
falhará ao se conectar ao servidor X (ou assim parece).
Baseado nos meus próprios testes no Zesty, isso deve funcionar.
Eu passei apenas 15 minutos tentando entender por que não estava funcionando apenas para perceber que tinha esquecido a linha export DISPLAY=:0
.