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

1

Eu tenho uma VM que precisa ser inicializada, executar uma tarefa específica e, em seguida, desligar-se.

Também é necessário abortar a seqüência de inicialização especial para obter o comportamento de inicialização "regular", 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 ele não funciona quando é realmente executado como parte da inicialização do sistema. Ele funciona bem, mas não responde ao Ctrl + C para ser realmente abortável.

O SSH: durante a execução deste script e a emissão de killall -INT rc.local também parece não interromper a execução do script, killall -9 rc.local o interrompe e descarta o console em login .

Parece que este sistema usa 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?

    
por Per von Zweigbergk 30.10.2015 / 16:25

1 resposta

1

Consegui contornar o problema usando o Plymouth , que é o aplicativo que fornece a tela gráfica "inicial" ao inicializar e desligando um sistema Ubuntu. Consegui usar isso para enviar o SIGINT para o script rc.local de forma 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á o suficiente para meus propósitos.

    
por 30.10.2015 / 19:42