Tarea abortable al inicio en Ubuntu 14.04

Tarea abortable al inicio en Ubuntu 14.04

Tengo una máquina virtual que necesita iniciarse, realizar una tarea específica y luego apagarse.

También debe ser posible cancelar la secuencia de inicio especial para obtener el comportamiento de inicio "normal", es decir, antes de que se ejecute la aplicación o antes del cierre.

Intenté lograr esto usando lo siguiente en /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

Esto funciona bien y funciona como se esperaba cuando lo ejecuto directamente como /etc/rc.local como root, cuando inicio sesión, pero parece que no funciona cuando en realidad se ejecuta como parte del inicio del sistema. Funciona bien, pero no responde a Ctrl+C para poder cancelarlo.

SSH: ingresar durante la ejecución de este script y emitir un killall -INT rc.localtampoco parece detener la ejecución del script, killall -9 rc.localaunque sí lo detiene y coloca la consola en login.

Parece que este sistema utiliza advenedizo para arrancar, como se determina a continuación:

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.

¿Qué me estoy perdiendo?

Respuesta1

Logré solucionar el problema usandoPlymouth, que es la aplicación que proporciona la pantalla gráfica de "presentación" al iniciar y apagar un sistema Ubuntu. Pude usar eso para enviar SIGINT al script rc.local de forma indirecta.

Es un truco, pero esto es lo que terminé haciendo:

#!/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

Esto será suficiente para mis propósitos.

información relacionada