Utilizando o systemd para executar um script antes do encerramento do sistema?

7

Eu escrevi um script que suspende todas as minhas máquinas do VirtualBox e coloco uma linha em /etc/rc.local.shutdown , mas parece que não funciona,

su - XX -c /XX

Quando eu estou inicializando da próxima vez, o VirtualBox me diz que a máquina era Aborted , então o script não foi executado. (Lançar esse script manualmente funciona para mim)

P.S já habilitei shutdown.target

EDITAR

O problema parece mais complicado do que eu pensava, no meu .bashrc , se ele está rodando em tty3 , ele executa startx , então quando o systemd decide desligar / reiniciar, ele deve matar VBoxSVC process e other coisas quando X Session morre.

Eu também tentei hackear o código-fonte de xfsm-shutdown-helper , fazer um systemctl falso que execute meu script primeiro, nenhum dos trabalhos acima.

    
por daisy 31.12.2012 / 04:25

1 resposta

1

Se eu entendi corretamente, você deseja suspender suas máquinas VB antes que sua sessão de bash em tty3 termine, ou antes que seu Xserver termine.

Acredito que o systemd não esteja ciente de sua Xsession em execução, porque você o inicia a partir do seu .bashrc, portanto, será difícil dizer ao systemd para suspender seus VBs antes que ele encerre seu shell ou sua Xsession. Você terá que encontrar um lugar na seqüência de desligamento que seja "cedo o suficiente", o que pode ser difícil de encontrar e semanticamente questionável, porque ele misturaria "coisas do usuário" com "coisas do sistema"

As soluções podem depender um pouco de como o systemd encerra seus processos, mas o seguinte deve ao menos apontar uma boa direção:

Antes de o shell terminar

suspendVB() {
        echo "suspending VBs"
        # put real code here
        exit
}

trap suspendVB EXIT

Se você fizer deste o rcfile do seu bash (ou adicioná-lo ao .bashrc), então o código em suspendVB() será executado antes do shell terminar. Você pode testar isso executando

bash --rcfile xxx

em que o arquivo xxx contém o código acima. Isso inicia outro shell dentro do seu shell atual, apenas para testes. Quando você executar uma saída simples, verá:

martin@beaureve:~$ exit
exit
suspending VBs
/home/martin >

e você está de volta ao seu shell original (login).

Você pode ter que descobrir como o systemd realmente encerra seus shells de login, e você pode ter que substituir EXIT por algum outro sinal (s). Pesquise o comando trap para saber mais.

Note que quando o systemd mata seus processos com "-9" (SIGKILL) então você não será capaz de interceptar a terminação, ou seja, você está sem sorte.

Antes do término da Xsession

Alternativamente, você pode tentar uma coisa semelhante com o seu Xsession. Isto é essencial nos casos em que o systemd termina sua Xsession antes de terminar seus shells. Você pode querer inserir uma armadilha em um dos arquivos de inicialização do X (por exemplo, .xinitrc) - procure as páginas de manual para startx e xinit para descobrir mais.

Se o seu arquivo startx for parecido com o meu, o xserver será iniciado em primeiro plano e você poderá simplesmente colocar seus comandos suspensos após a linha onde o X está realmente iniciado (e não usar traps):

xinit "$client" $clientargs -- "$server" $display $serverargs
retval=$?
echo " --- suspending VBs ---"

Eu coloquei na linha dizendo "suspendendo VBs" e quando eu corro startx -- vt8 eu recebo uma sessão fullblows (kde) em vt8 e somente quando eu sair, a linha "suspendendo VBs" aparece na tela.

    
por 23.12.2013 / 21:06