Come configuro upstart per eseguire uno script all'arresto quando il processo impiega più di 10 secondi?


11

Sto eseguendo Ubuntu 11.10 in una macchina virtuale (VirtualBox) per saperne di più sullo sviluppo in Linux. Sto usando un repository git per salvare il mio lavoro e ho scritto uno script per raggruppare il mio lavoro e salvarlo nella cartella condivisa per l'uso mentre la macchina virtuale non è in esecuzione.

Vorrei eseguire automaticamente questo script prima dell'arresto in modo che il mio lavoro sia sempre disponibile se la VM è spenta (attualmente devo eseguire manualmente lo script).

Non so se upstart sia il modo migliore per ottenere questo risultato, ma questa è la configurazione che ho scritto come 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

Il risultato è che viene eseguito solo un tocco (il primo tocco in pre-avvio). Cosa devo cambiare per vedere uno dei tocchi dopo il sonno per funzionare? O c'è un modo più semplice per ottenere questo risultato?

Grazie in anticipo.

Risposte:


7

L'Upstart Intro, Cookbook e Best Practices ha un gran numero di frammenti di codice da utilizzare nella creazione di attività upstart e posti di lavoro.

La sezione del processo di spegnimento del ricettario dice che /etc/init/rc.confverrà eseguito e chiamato /etc/init.d/rc. A sua volta questo alla fine chiamerà /etc/init.d/sendsigs. Quindi, se start on starting rcpoi il tuo compito verrà eseguito prima di rc (e i sigterm che normalmente dovrebbero chiudere il processo).

file: /etc/init/test.conf

description "test script to run at shutdown"

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

file: /etc/init/test.sh

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

1
Aggiunto un esempio concreto a questa domanda, ma non funziona (solo il primo tocco viene eseguito allo spegnimento) anche se la documentazione in Creare un alias di eventi dice che dovrebbe. Per favore, guarda per vedere se ho fatto un errore.
Tiris,

Tiris, dovrebbe funzionare. Sarei interessato a vedere il tuo / var / log / syslog dopo il riavvio, in particolare per vedere se il processo di test è stato forzatamente ucciso da upstart.
SpamapS,

1
L'ultima modifica di questa risposta funziona. Controlla la cronologia delle revisioni per vedere il problema figlio. Immagino che avrei dovuto commentare che ho fatto una modifica (o è più corretto rimuovere il commento e aggiungerne uno nuovo? Esiste un galateo di scambio di stack?). Sarei interessato a sapere perché il problema del bambino non funziona (poiché la documentazione dice che dovrebbe).
Tiris,

Cosa significa esattamente il file test.conf? Devo creare un file chiamato test.conf o aggiungerlo a rc.conf?
heneryville,

@heneryville test.confè solo un nome file casuale. Potresti usare altrettanto facilmente whatEverYouWant.conf. Il tuo commento mostra anche che non hai letto il "Ricettario" menzionato nella risposta. Se si guarda nella sezione 4.2, il file di configurazione del lavoro è spiegato in modo più approfondito.
Tiris

7

Penso che questo non possa essere fatto tramite upstart , in quanto lo script /etc/init.d/sendsigs , che viene invocato da upstart quando si arresta / riavvia, uccide tutti i processi ( killall5 -9) entro 10 secondi e anche se ciò non riesce, va bene per smontare tutto e spegnere.

Il modo migliore sarebbe usare gli script di stile /etc/init.d arrugginiti .

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

:

Quindi attiva lo script

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

Questo metterà lo script prima dello script sendigs sui runlevel da 0 a 6 (arresto, riavvio). Questo script di esempio registrerà la data, quindi dormirà per 20 secondi, quindi registrerà di nuovo la data su /root/s.log .)

Ulteriori informazioni:


Non ho alcuna familiarità con questo genere di cose. C'è una buona guida su come farlo funzionare? Modifica con maggiori informazioni.
Tiris,

Ho provato questo e non funziona (bene non esattamente). Ho aggiunto un touch /media/sf_LinuxEducation/starte touch /media/sf_LinuxEducation/start-longproprio accanto ai comandi della data. Le date vengono registrate, ma i tocchi non vengono toccati. Questo mi fa chiedermi se quell'unità sia smontata al momento dell'esecuzione dello script. Penso che possa avere qualcosa a che fare con l'argomento NN, anche se non sono sicuro di come funzioni effettivamente questo argomento (la pagina man lo spiega in un modo molto snervante). Come fai a sapere quale numero (o coppia di numeri) dovrebbe essere impostato in questo argomento?
Tiris,

Gli script vengono eseguiti secondo i loro numeri come si vede quando si elenca la /etc/rc6.ddirectory. Pertanto, lo script 19 shutdown avrebbe dovuto essere eseguito prima di qualsiasi smontaggio (> 31). Ma perché non provare le tue ipotesi e toccare invece un file /root?
organizza il

Guardando nella directory si /etc/rc6.drivela che le cartelle condivise vengono montate / smontate con lo K70vboxaddscript. Cambiando l'argomento NN (per il mio script) in 71, il mio script verrebbe eseguito prima dello smontaggio delle cartelle condivise VB? Lo proverò più tardi oggi.
Tiris,

Beh, non ha funzionato. Aggiornamento: ho aggiunto un touch /root/startprima del sleep 20comando e non viene creato alcun file. Non so nemmeno da dove cominciare a scoprire perché. Le date vengono aggiunte felicemente al /root/s.logfile perché non posso toccare un file?
Tiris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.