web-dev-qa-db-fra.com

Comment configurer upstart pour exécuter un script à l’arrêt lorsque le processus dure plus de 10 secondes?

J'exécute Ubuntu 11.10 sur une machine virtuelle (VirtualBox) pour en savoir plus sur le développement sous Linux. J'utilise un référentiel git pour enregistrer mon travail et ai écrit un script pour regrouper mon travail et l'enregistrer dans le dossier partagé pour l'utiliser lorsque la machine virtuelle n'est pas en cours d'exécution.

Je souhaite exécuter automatiquement ce script avant l’arrêt afin que mon travail soit toujours disponible si la machine virtuelle est désactivée (pour l’instant, je dois exécuter le script manuellement).

Je ne sais pas si le plus récent est le meilleur moyen d'y parvenir, mais voici la configuration que j'ai écrite comme test:

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

Le résultat est qu'une seule touche est accomplie (la première touche en pré-démarrage). Que dois-je changer pour voir l'une des touches après le sommeil au travail? Ou y a-t-il un moyen plus facile d'obtenir ceci accompli?

Merci d'avance.

11
Tiris

Le pstart Intro, Cookbook and Best Practices contient un grand nombre d'extraits de code à utiliser pour créer des tâches et des travaux ultérieurs.

La section processus d'arrêt du livre de recettes indique que /etc/init/rc.conf sera exécuté et appelle /etc/init.d/rc. À son tour, cela appellera éventuellement /etc/init.d/sendsigs. Donc, si vous start on starting rc, votre tâche sera exécutée avant rc (et les sigterms qui feraient normalement fermer le processus).

fichier: /etc/init/test.conf

description "test script to run at shutdown"

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

fichier: /etc/init/test.sh

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

Je pense que cela ne peut pas être fait via pstart, comme le script /etc/init.d/sendigs , qui est appelé par pstart ​​lors de l’arrêt/du redémarrage, tue tous les processus (killall5 -9) dans les 10 secondes, et même si cela ne réussit pas, il permet de tout démonter et de s’arrêter.

Le meilleur moyen serait d'utiliser les scripts de style rouillés /etc/init.d .

Exemple: /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

:

Puis activez le script

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

Cela placera le script avant le script Savesigs sur les niveaux d'exécution 0 à 6 (arrêt, redémarrage). Cet exemple de script enregistrera la date, puis dormira pendant 20 secondes, puis enregistrera à nouveau la date sur / root/s.log.)

Plus d'informations:

7
arrange