Como executar um script interativo antes do encerramento do xserver?

3

Toda vez que eu desligar ou reiniciar meu laptop (Ubuntu 14.04), eu gostaria de executar um script que verifica, se eu empurrei meu código mais novo para o meu repositório git remoto. Se eu esqueci, então ele abre um terminal, pede ao usuário para inserir uma mensagem de commit e envia as mudanças. Eu já tenho o script funcionando.

Agora estou procurando uma maneira de fazer esse script ser executado automaticamente quando eu desligar ou reinicializar, mas antes da saída da GUI.

Minha abordagem até agora é com o System V Init (sim, eu sei que é um pouco datado):

Eu copio meu script de inicialização com o cabeçalho LSB para /etc/init.d:

sudo cp ~/git_checker /etc/init.d/

, altere as permissões:

sudo chmod a+x /etc/init.d/git_checker

e configure cenários de execução:

sudo update-rc.d /etc/init.d/git_checker defaults

Quando eu testo esse script com sudo service git_checker start ,  Eu recebo o erro: "Falha ao analisar argumentos: não é possível abrir a exibição:"

Ao ler, descobri que os scripts init não devem ser usados para abrir terminais (assim: %código%  ), porque não é garantido que o servidor X esteja rodando quando scripts init são executados.

Os scripts de inicialização parecem ser o caminho errado. Existe outro caminho? Talvez com upstart ou systemd?

No caso de executar o script na inicialização do sistema, posso simplesmente colocá-lo em aplicativos de inicialização. Existe algo semelhante, como aplicativos de desligamento?

    
por Oscillon 19.03.2016 / 17:52

1 resposta

1

Criei um pequeno script de monitoramento há algum tempo que chamará uma função de interrupção quando o script detectar a tentativa do usuário ao desligar o computador. A pequena modificação necessária para o seu caso específico é cancelar a ação de desligamento, executar o script e, em seguida, chamar o desligamento.

#!/bin/bash

main()
{
  dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal,member=RebootRequested" | \
  while read -r line;
  do
#   echo $line
     grep -q '.*NameAcquired.*' <<< "$line"  && continue  #  Ignore that first line
    if [ -n "$line"  ];then
       interrupt 
    fi
  done
}

interrupt()
{ 
  # The first command will close the shutdown dialog
  qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
  # place call to your script bellow this comment
  zenity --info --text='Remember to push changes to git repo'
  # Uncomment line bellow for shutdown
  # qdbus com.canonical.Unity  /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown

}

main

Este script, claro, deve ser adicionado como parte dos aplicativos de inicialização ou você pode criar manualmente o arquivo .desktop para ele

OBSERVAÇÃO : Este script funciona apenas com a GUI, portanto, se o usuário emitir um comando sudo shutdown -P now , não funcionará. Você precisaria também monitorar o comando shutdown através de outro script usando pgrep shutdown ou integrar outra função no script.

Por exemplo, no meu script acima, você deseja adicionar essa função

manual_shutdown_monitor()
{
  while true 
  do
  if pgrep shutdown > /dev/null
  then
      zenity --info --text="GOT MANUAL"
  fi
  sleep 0.25
  done
}

E, em seguida, chame essa função em main() como esta

manual_shutdown_monitor &
    
por Sergiy Kolodyazhnyy 19.03.2016 / 18:31