¿Cómo configuro advenedizo para ejecutar un script al apagar cuando el proceso tarda más de 10 segundos?

¿Cómo configuro advenedizo para ejecutar un script al apagar cuando el proceso tarda más de 10 segundos?

Estoy ejecutando ubuntu 11.10 en una máquina virtual (VirtualBox) para aprender más sobre el desarrollo en Linux. Estoy usando un repositorio git para guardar mi trabajo y escribí un script para agrupar mi trabajo y guardarlo en la carpeta compartida para usarlo mientras la máquina virtual no se está ejecutando.

Me gustaría ejecutar este script automáticamente antes de apagarlo para que mi trabajo esté siempre disponible si la máquina virtual está apagada (actualmente tengo que ejecutar el script manualmente).

No sé si advenedizo es la mejor manera de lograr esto, pero esta es la configuración que escribí como prueba:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

El resultado es que sólo se realiza un toque (el primer toque en el pre-inicio). ¿Qué necesito cambiar para que uno de los toques después de dormir funcione? ¿O existe una manera más fácil de lograrlo?

Gracias de antemano.

Respuesta1

ElIntroducción advenediza, libro de cocina y mejores prácticastiene una gran cantidad de fragmentos de código para usar en la creación de tareas y trabajos iniciales.

Elproceso de apagadoLa sección del libro de recetas dice que /etc/init/rc.confse ejecutará y llamará /etc/init.d/rc. A su vez, esto eventualmente llamará /etc/init.d/sendsigs. Entonces, si lo hace start on starting rc, su tarea se ejecutará antes de rc (y los términos de firma que normalmente cerrarían el proceso).

archivo: /etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

archivo: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

Respuesta2

Creo que esto no se puede hacer a través deadvenedizo, como el/etc/init.d/sendsigsscript, que es invocado poradvenedizoal detener/reiniciar, finaliza todos los procesos ( killall5 -9) en 10 segundos, e incluso si eso no tiene éxito, desmonta todo y apaga.

La mejor manera sería utilizar el oxidado./etc/init.dguiones de estilo.

Ejemplo:/etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

Luego activa el script.

sudo update-rc.d shutdown_job start 19 0 6 .

Esto pondrá el guión delante delenvíasigsscript en los niveles de ejecución 0 a 6 (apagar, reiniciar). Este script de muestra registrará la fecha, luego dormirá durante 20 segundos y luego registrará la fecha nuevamente para/root/s.log.)

Más información:

información relacionada