¿Cómo configuro el arranque para ejecutar un script en el apagado cuando el proceso lleva más de 10 segundos?


11

Estoy ejecutando ubuntu 11.10 en una máquina virtual (VirtualBox) para obtener más información sobre el desarrollo en Linux. Estoy usando un repositorio git para guardar mi trabajo y he escrito un script para agrupar mi trabajo y guardarlo en la carpeta compartida para usar 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 el vm está apagado (actualmente tengo que ejecutar el script manualmente).

No sé si el 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 solo se logra un toque (el primer toque en pre-inicio). ¿Qué necesito cambiar para ver uno de los toques después del sueño para trabajar? ¿O hay una manera más fácil de lograr esto?

Gracias por adelantado.

Respuestas:


7

La Introducción, Libro de Cocina y Mejores Prácticas de Upstart tiene una gran cantidad de fragmentos de código para usar en la creación de tareas y trabajos de arranque.

La sección del proceso de apagado del libro de cocina 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 start on starting rcsu tarea se ejecutará antes de rc (y los símbolos 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

1
Se agregó un ejemplo concreto a esta pregunta, pero no funciona (solo el primer toque se ejecuta en el apagado) a pesar de que la documentación en Crear un alias de evento dice que debería. Míralo y verifica si cometí un error.
Tiris

Tiris, esto debería funcionar. Me interesaría ver su / var / log / syslog después del reinicio, particularmente para ver si el proceso de prueba fue forzado por el arranque.
SpamapS

1
La última edición de esta respuesta funciona. Verifique el historial de revisiones para ver el problema hijo. Supongo que debería haber comentado que hice una edición (¿o es más apropiado eliminar el comentario y agregar uno nuevo? ¿Hay una etiqueta de intercambio de pila?). Me interesaría saber por qué el problema del niño no funciona (ya que la documentación dice que debería).
Tiris

¿Qué significa exactamente el archivo test.conf? ¿Hago un archivo llamado test.conf o lo agrego a rc.conf?
heneryville

@heneryville test.confes solo un nombre de archivo aleatorio. Podrías usarlo con la misma facilidad whatEverYouWant.conf. Su comentario también muestra que no leyó el "Libro de cocina" mencionado en la respuesta. Si mira en la sección 4.2, el archivo de configuración del trabajo se explica más detalladamente.
Tiris

7

Creo que esto no se puede hacer a través de advenedizo , como el /etc/init.d/sendsigs guión, que se invoca por el recién llegado al detener / reiniciar, mata a todos los procesos ( killall5 -9) dentro de 10 segundos, e incluso si eso no tiene éxito, va para desmontar todo y apagarlo.

La mejor manera sería utilizar los guiones de estilo oxidado /etc/init.d .

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 active el script

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

Esto colocará la secuencia de comandos antes que la secuencia de comandos de envío en los niveles de ejecución 0 a 6 (apagado, reinicio). Este script de muestra registrará la fecha, luego dormirá durante 20 segundos y luego volverá a registrar la fecha en /root/s.log ).

Más información:


No estoy familiarizado con hacer este tipo de cosas. ¿Existe una buena guía para que esto funcione? Por favor edite con más información.
Tiris

Probé esto y no funciona (bueno, no exactamente). He añadido una touch /media/sf_LinuxEducation/starty touch /media/sf_LinuxEducation/start-longjusto al lado de los comandos de la fecha. Se registran las fechas, pero no se tocan los toques. Esto me hace preguntarme si esa unidad está desmontada en el momento en que se ejecuta el script. Creo que puede tener algo que ver con el argumento NN, aunque no estoy realmente seguro de cómo funciona este argumento (la página del manual lo explica de una manera muy alucinante). ¿Cómo sabe qué número (o par de números) debe establecerse en este argumento?
Tiris

Las secuencias de comandos se ejecutan según sus números como se ve cuando enumera el /etc/rc6.ddirectorio. Por lo tanto, el script de apagado 19 debería haberse ejecutado antes de realizar cualquier desmontaje (> 31). Pero, ¿por qué no probar su hipótesis y tocar un archivo en su /rootlugar?
organizar el

Mirar en el directorio /etc/rc6.drevela que las carpetas compartidas se están montando / desmontando con el K70vboxaddscript. ¿Cambiar el argumento NN (para mi script) a 71 hará que mi script se ejecute antes de desmontar las carpetas compartidas de VB? Lo intentaré más tarde hoy.
Tiris

Bueno, eso no funcionó. Actualización: agregué un touch /root/startantes del sleep 20comando y no se creó ningún archivo. Ni siquiera sé por dónde empezar a averiguar por qué. Las fechas se agregan felizmente al /root/s.logarchivo ¿por qué no puedo tocar un archivo?
Tiris
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.