Jak skonfigurować upstart, aby uruchamiał skrypt przy wyłączaniu, gdy proces trwa dłużej niż 10 sekund?

11

Używam Ubuntu 11.10 na maszynie wirtualnej (VirtualBox), aby dowiedzieć się więcej o programowaniu w systemie Linux. Korzystam z repozytorium git, aby zapisać swoją pracę i napisałem skrypt, aby spakować moją pracę i zapisać ją w folderze współdzielonym do użytku, gdy maszyna wirtualna nie jest uruchomiona.

Chciałbym automatycznie uruchomić ten skrypt przed zamknięciem, aby moja praca była zawsze dostępna, jeśli vm jest wyłączony (obecnie muszę ręcznie uruchomić skrypt).

Nie wiem, czy upstart jest najlepszym sposobem na osiągnięcie tego, ale jest to konfiguracja, którą napisałem jako 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

W rezultacie wykonywany jest tylko jeden dotyk (pierwszy dotyk przed uruchomieniem). Co muszę zmienić, aby zobaczyć jeden z akcentów po śnie do pracy? Czy jest łatwiejszy sposób na osiągnięcie tego?

Z góry dziękuję.

Tiris
źródło

Odpowiedzi:

7

Upstart Intro, Cookbook i Dobrych Praktyk ma wielką liczbę fragmentów kodu do wykorzystania w tworzeniu zadań Upstart i miejsc pracy.

Proces zamykania część książki kucharskiej mówi, że /etc/init/rc.confbędzie działać i wezwanie /etc/init.d/rc. To z kolei zadzwoni /etc/init.d/sendsigs. Więc jeśli ty start on starting rcwtedy twoje zadanie zostanie wykonane przed rc (i sigterms, które normalnie miałyby proces zamknięty).

plik: /etc/init/test.conf

description "test script to run at shutdown"

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

plik: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
aquafunk
źródło
1
Dodano konkretny przykład do tego pytania, ale to nie działa (tylko pierwszy dotyk jest uruchamiany przy zamykaniu), mimo że dokumentacja w Utwórz alias zdarzenia mówi, że powinna. Proszę spojrzeć na to i zobaczyć, czy popełniłem błąd.
Tiris,
Tiris, to powinno zadziałać. Byłbym zainteresowany zobaczeniem twojego / var / log / syslog po restarcie, szczególnie by zobaczyć, czy proces testu został zabity siłą przez start-up.
SpamapS,
1
Najnowsza edycja tej odpowiedzi działa. Sprawdź historię zmian, aby zobaczyć problem z dzieckiem. Chyba powinienem był skomentować, że dokonałem edycji (czy może lepiej jest usunąć komentarz i dodać nowy? Czy istnieje etykieta wymiany stosów?). Byłbym zainteresowany dowiedzieć się, dlaczego problem dziecko nie działa (ponieważ dokumentacja mówi, że powinno).
Tiris,
Co dokładnie oznacza plik test.conf? Czy utworzę plik o nazwie test.conf, czy dodam go do rc.conf?
heneryville
@heneryville test.confto po prostu losowa nazwa pliku. Możesz równie łatwo użyć whatEverYouWant.conf. Twój komentarz pokazuje również, że nie przeczytałeś „Książki kucharskiej” wspomnianej w odpowiedzi. Jeśli zajrzysz do sekcji 4.2, plik konfiguracji zadania jest dokładniej wyjaśniony.
Tiris
7

Myślę, że nie można tego zrobić za pomocą upstart , ponieważ skrypt /etc/init.d/sendsigs , który jest wywoływany przez upstart podczas zatrzymywania / restartowania, zabija wszystkie procesy ( killall5 -9) w ciągu 10 sekund, a nawet jeśli to się nie powiedzie, idzie za odmontowanie wszystkiego i wyłączenie.

Najlepszym sposobem byłoby użycie zardzewiałych skryptów w stylu /etc/init.d .

Przykład: /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

:

Następnie aktywuj skrypt

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

Spowoduje to umieszczenie skryptu przed skryptem sendigs na poziomach 0 i 6 (zamknięcie, ponowne uruchomienie). Ten przykładowy skrypt rejestruje datę, następnie śpi przez 20 sekund, a następnie ponownie rejestruje datę w /root/s.log .)

Więcej informacji:

zorganizować
źródło
Nie jestem wcale zaznajomiony z robieniem tego typu rzeczy. Czy istnieje dobry przewodnik, jak to zrobić? Edytuj z większą ilością informacji.
Tiris,
Wypróbowałem to i to nie działa (dobrze nie do końca). Dodałem touch /media/sf_LinuxEducation/starti touch /media/sf_LinuxEducation/start-longobok poleceń daty. Daty są rejestrowane, ale zmiany nie są zmieniane. To sprawia, że ​​zastanawiam się, czy ten dysk nie jest odmontowany podczas uruchamiania skryptu. Myślę, że może to mieć coś wspólnego z argumentem NN, chociaż nie jestem pewien, jak naprawdę działa ten argument (strona podręcznika wyjaśnia to w bardzo zgięty sposób). Skąd wiesz, jaką liczbę (lub parę liczb) należy ustawić w tym argumencie?
Tiris,
Skrypty są wykonywane zgodnie z ich liczbą, co widać na liście /etc/rc6.dkatalogów. Tak więc skrypt zamknięcia 19 powinien był zostać wykonany przed wykonaniem odmontowania (> 31). Ale dlaczego nie wypróbować swojej hipotezy i /rootzamiast tego dotknąć pliku ?
umów się
Przejrzenie katalogu /etc/rc6.dpokazuje, że foldery współdzielone są montowane / odmontowywane za pomocą K70vboxaddskryptu. Czy zmiana argumentu NN (dla mojego skryptu) na 71 sprawi, że mój skrypt będzie działał przed odmontowaniem folderów współdzielonych VB? Spróbuję dzisiaj później.
Tiris,
Cóż, to nie zadziałało. Aktualizacja: dodałem touch /root/startprzed sleep 20poleceniem i żaden plik nie został utworzony. Nie wiem nawet, od czego zacząć, aby dowiedzieć się, dlaczego. Daty są szczęśliwie dodawane do /root/s.logpliku, dlaczego nie mogę go dotknąć?
Tiris,