Tarefa abortável na inicialização do Ubuntu 14.04

Tarefa abortável na inicialização do Ubuntu 14.04

Eu tenho uma VM que precisa inicializar, executar uma tarefa específica e depois desligar-se.

Também precisa ser possível abortar a sequência especial de inicialização para obter o comportamento de inicialização "normal", ou seja, antes da execução do aplicativo ou antes do desligamento.

Eu tentei fazer isso usando o seguinte em /etc/rc.local:

#!/bin/bash
trap "echo;echo Resuming regular system startup...;exit" SIGINT
echo "Press Ctrl+C within 10 seconds to skip application run..."
sleep 10
su ubuntu -c /home/ubuntu/application.py
echo "Press Ctrl+C within 30 seconds to abort shutdown..."
sleep 30
shutdown -h now

Isso funciona bem e funciona como esperado quando eu apenas o executo diretamente como /etc/rc.local como root, quando logado, mas parece que não funciona quando é realmente executado como parte da inicialização do sistema. Funciona bem, mas não responde a Ctrl+C para ser realmente abortado.

SSH: entrar durante a execução deste script e emitir um killall -INT rc.localtambém não parece interromper a execução do script, killall -9 rc.localmas o interrompe e coloca o console em login.

Parece que este sistema usa o upstart para inicialização, conforme determinado abaixo:

root@fundie:~# ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /sbin/init
root@fundie:~# /sbin/init --version
init (upstart 1.12.1)
Copyright (C) 2006-2014 Canonical Ltd., 2011 Scott James Remnant

This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

o que estou perdendo?

Responder1

Consegui contornar o problema usandoPlymouth, que é o aplicativo que fornece a tela gráfica "splash" ao inicializar e desligar um sistema Ubuntu. Consegui usar isso para enviar o SIGINT para o script rc.local de maneira indireta.

É um pouco complicado, mas eis o que acabei fazendo:

#!/bin/bash
plymouth watch-keystroke --command="kill -INT $$" --keys=' ' &
trap "echo;echo Resuming regular system startup...;exit" SIGINT
for i in `seq 10 -1 1`
do
        echo -ne "\rPress spacebar within $i second(s) to skip application run... "
        sleep 1
done
echo
su ubuntu -c /home/ubuntu/application.py
for i in `seq 30 -1 1`
do
        echo -ne "\rPress spacebar within $i second(s) to abort shutdown... "
        sleep 1
done
echo
shutdown -h now

Isso servirá suficientemente para meus propósitos.

informação relacionada