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

11

J'utilise 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 j'ai écrit un script pour regrouper mon travail et l'enregistrer dans le dossier partagé pour l'utiliser pendant que la machine virtuelle n'est pas en cours d'exécution.

Je voudrais exécuter automatiquement ce script avant l'arrêt afin que mon travail soit toujours disponible si le VM est éteint (actuellement je dois exécuter manuellement le script).

Je ne sais pas si upstart 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 dans le pré-démarrage). Que dois-je changer pour voir une des touches après le sommeil travailler? Ou existe-t-il un moyen plus simple de réaliser cela?

Merci d'avance.

Tiris
la source

Réponses:

7

L' introduction Upstart, le livre de recettes et les meilleures pratiques contiennent un grand nombre d'extraits de code à utiliser pour créer des tâches et des travaux parvenus.

La section du processus d'arrêt du livre de recettes indique que ce /etc/init/rc.confsera exécuté et appelé /etc/init.d/rc. À son tour, cela finira par appeler /etc/init.d/sendsigs. Donc, si vous start on starting rcalors votre tâche sera exécutée avant rc (et les sigterms qui auraient normalement arrêté 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
aquafunk
la source
1
Ajout d'un exemple concret à cette question, mais cela ne fonctionne pas (seule la première touche est exécutée à l'arrêt), même si la documentation dans Créer un alias d'événement le dit. Veuillez le regarder et voir si j'ai fait une erreur.
Tiris
Tiris, cela devrait fonctionner. Je serais intéressé de voir votre / var / log / syslog après le redémarrage, en particulier pour voir si le processus de test a été tué de force par upstart.
SpamapS
1
La dernière modification de cette réponse fonctionne. Consultez l'historique des révisions pour voir l'enfant à l'origine du problème. Je suppose que j'aurais dû dire que j'ai fait une modification (ou est-il plus approprié de supprimer le commentaire et d'en ajouter un nouveau? Y a-t-il une étiquette d'échange de pile?). Je serais intéressé de savoir pourquoi l'enfant à problème ne fonctionne pas (puisque la documentation le dit).
Tiris
Que signifie exactement le fichier test.conf? Dois-je créer un fichier appelé test.conf ou dois-je l'ajouter à rc.conf?
heneryville
@heneryville test.confest juste un nom de fichier aléatoire. Vous pouvez tout aussi bien l'utiliser whatEverYouWant.conf. Votre commentaire montre également que vous n'avez pas lu le "Cookbook" mentionné dans la réponse. Si vous regardez dans la section 4.2, le fichier de configuration du travail est expliqué plus en détail.
Tiris
7

Je pense que cela ne peut pas être fait via upstart , car le script /etc/init.d/sendsigs , qui est invoqué par upstart lors de l'arrêt / redémarrage, tue tous les processus ( killall5 -9) dans les 10 secondes, et même si cela ne réussit pas, il va pour tout démonter et arrêter.

La meilleure façon serait d'utiliser les scripts de style /etc/init.d rouillés .

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

:

Activez ensuite le script

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

Cela placera le script avant le script sentins 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 dans /root/s.log .)

Plus d'informations:

organiser
la source
Je ne suis pas du tout familier avec ce genre de choses. Existe-t-il un bon guide pour que cela fonctionne? Veuillez modifier avec plus d'informations.
Tiris
J'ai essayé cela et cela ne fonctionne pas (enfin pas exactement). J'ai ajouté un touch /media/sf_LinuxEducation/startet touch /media/sf_LinuxEducation/start-longjuste à côté des commandes de date. Les dates sont enregistrées, mais les touches ne sont pas touchées. Cela me fait me demander si ce lecteur n'est pas monté au moment de l'exécution du script. Je pense que cela peut avoir quelque chose à voir avec l'argument NN, bien que je ne sais pas vraiment comment cet argument fonctionne (la page de manuel l'explique d'une manière très hallucinante). Comment savez-vous quel nombre (ou paire de nombres) doit être défini dans cet argument?
Tiris
Les scripts sont exécutés en fonction de leur nombre, comme indiqué lorsque vous répertoriez le /etc/rc6.drépertoire. Ainsi, le script d'arrêt 19 aurait dû être exécuté avant tout démontage (> 31). Mais pourquoi ne pas essayer votre hypothèse et toucher un fichier à la /rootplace?
organiser
La recherche dans le /etc/rc6.drépertoire révèle que les dossiers partagés sont montés / démontés avec le K70vboxaddscript. Est-ce que changer l'argument NN (pour mon script) en 71 ferait exécuter mon script avant le démontage des dossiers partagés VB? Je vais l'essayer plus tard dans la journée.
Tiris
Eh bien, cela n'a pas fonctionné. Mise à jour: j'ai ajouté un touch /root/startavant la sleep 20commande et aucun fichier n'est créé. Je ne sais même pas par où commencer pour savoir pourquoi. Les dates sont heureusement ajoutées au /root/s.logfichier pourquoi ne puis-je pas toucher un fichier?
Tiris