Dlaczego moja usługa upstart nie uruchamia się przy starcie systemu?

37

W następstwie tego pytania napisałem prostą usługę upstart ( /etc/init/pms.conf ) dla mojego bezgłowego urządzenia Ubuntu Server 11.04 w następujący sposób:

start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn

exec /home/administrator/pms-current/PMS.sh

Mogę uruchomić (lub zatrzymać) tę usługę do woli z wiersza poleceń:

service pms start

I widzę, że to naprawdę działa.

Jednak po pierwszym uruchomieniu komputera usługa się nie uruchamia. Jeśli wstawię SSH w pole i sprawdzę status usługi, otrzymam:

$ service pms status
pms stop/waiting

Moje pytanie brzmi: dlaczego tak się dzieje? Dlaczego moja usługa nie rozpoczyna się po uruchomieniu?

AKTUALIZACJA 1 : nie jestem pewien, czy moja usługa została uruchomiona, a następnie umarła, czy po prostu nie była wcale uruchamiana, dodałem następujące informacje do PMS.sh:

echo "STARTED" > $STARTLOG

To oczywiście daje mi coś do poszukiwania. Przetestowałem to, sam uruchamiając usługę, a następnie sprawdzając start.log . Następnie usunąłem plik start.log i uruchomiłem ponownie. Nie było go po ponownym uruchomieniu, więc wydaje się, że upstart zdecydowanie nie uruchamia mojej usługi. Przypuszczam, że może umrzeć na wcześniejszym etapie procesu, ale wydaje się to mało prawdopodobne, biorąc pod uwagę prostotę tego wszystkiego.

AKTUALIZACJA 2 : Właśnie zaktualizowałem do wersji 11.10, która obejmuje aktualizację upstart, ale ten problem nadal występuje.

AKTUALIZACJA 3 : Zgodnie z życzeniem uruchomiłem system --debug. Dane wyjściowe kota /var/log/syslog | grep initsą zbyt długie, aby umieścić je w pytaniu, ale można je zobaczyć tutaj .

AKTUALIZACJA 4 : Więcej dzienników, tym razem konfekcja upstart znajduje się na górze. Uruchom 1 i uruchom 2 .

Kent Boogaart
źródło
Czy na pewno skrypt nie został wykonany? Komunikat zatrzymania / oczekiwania pms oznacza, że ​​uruchomiono zadanie upstart i że wszystkie polecenia zakończyły się normalnie.
umów się
Dodaj dane wyjściowe cat /var/log/syslog | grep initpo włączeniu rejestrowania rozruchu w celu uruchomienia przy użyciu instrukcji z Upstart Debugging
Ciaran Liedeman
@Anarci: proszę zobaczyć aktualizację 3 w moim pytaniu.
Kent Boogaart
Większość użytkowników nie poda tam takiego adresu e-mail, a raczej podaje link do strony pastebin, takiej jak Ubuntu pastebin
Ciaran Liedeman
@Anarci: gotowe - zobacz moje pytanie.
Kent Boogaart

Odpowiedzi:

19

Poleciłbym zwiększenie gadatliwości zadania, np. Poprzez użycie wpisów przed rozpoczęciem / po uruchomieniu.

pre-start script
  logger "pre-start for myprog"
end script

post-start script
  logger "post-start for myprog"
end script

# and for PMS itself:
script
  logger "just before executing PMS"
  exec /home/administrator/pms-current/PMS.sh
end script

Więcej informacji na stronie http://upstart.ubuntu.com/cookbook/

Zajrzyj również na http://upstart.ubuntu.com/wiki/Debugging

Clausi
źródło
To naprawdę działa na moją głowę. Próbowałem tuzina różnych rzeczy z tyłu twojego postu. Wszystkie zawiodły z powodu różnych niejasnych komunikatów w dziennikach. Moja ostatnia próba zakończyła się procesem głównym init: pms (1329) zakończonym statusem 143 , co dla mnie oznacza nic. Widzę, że PMS.sh nawet się nie uruchamia, ponieważ pierwszą rzeczą, którą robi, jest zapis do własnego dziennika, a ten wpis dziennika nie jest obecny. Widzę moje wyjście przed uruchomieniem, które mówi mi, że plik docelowy istnieje i jest wykonywalny. Odbiorę to jutro, ale jeśli masz jakieś pomysły, chciałbym je usłyszeć. Dzięki.
Kent Boogaart
Cześć @KentBoogaart, Wydaje mi się, że mam ten sam problem. Znalazłeś rozwiązanie?
Daniele B,
@KentBoogaart Mam taki sam problem jak Ty? Masz szczęście ze swoim?
Mevin Babu
14

Prawdopodobnie dzieje się tutaj, że pms uruchamia się przed pojawieniem się kart sieciowych i prawdopodobnie nawet przed kartą sprzężenia zwrotnego (lo). Zakładając, że mówimy o PS3 Media Server, jest to usługa sieciowa i prawdopodobnie nie lubi uruchamiania bez dostępnych interfejsów.

Spróbuj zmienić kryteria początkowe na:

start on filesystem and net-device-up IFACE!=lo

Oznacza to, że zacznij po uruchomieniu „prawdziwego” interfejsu sieciowego. Jednak może to nie być idealne, jeśli eth0 jest kolejnym uruchomionym interfejsem, uruchamia się PMS, ale naprawdę chcesz, aby PMS używał wlan0, to nie zadziała. Usługa zostanie uruchomiona, ale może nie być w stanie wybrać interfejsu, na którym chcesz jej słuchać. Zakładając, że znasz interfejs, który chcesz przesyłać strumieniowo i że się nie zmieni, zapisałbym go na stałe w zadaniu, np .:

start on filesystem and net-device-up IFACE=wlan0

W Oneiric (11.10) można użyć zdarzenia static-network-updo oczekiwania na wszystkie statycznie skonfigurowane urządzenia. To miłe, ponieważ pozwala pisać zadania zależne od sieci bez kodowania interfejsu. [Uwaga: przez „wszystkie statycznie skonfigurowane urządzenia” mam na myśli używanie /etc/network/interfaceszamiast NetworkManagera. Nie oznacza to statycznego w znaczeniu statycznego adresu IP vs. DHCP.]

Mark Russell
źródło
Brzmiało to jak sztuczka, ale nie działało. Mam tylko loi eth0ale kiedyś swoją drugą propozycję: start on filesystem and net-device-up IFACE=eth0. Nadal nie można go uruchomić po ponownym uruchomieniu. Właśnie zauważyłem coś w dzienniku PMS, który może być potencjalnym tropem.
Zbadam
To interesujące. Jedną rzeczą, o której nie wspomniałem, jest to, że wypróbowałem twój oryginalny skrypt i działał on podczas uruchamiania komputera. Przypisałem to właśnie losowi losowania (tj. W moim stanie wyścigowym wygrał dobry samochód, a w twoim wygrał zły samochód). Naprawdę nie widzę, jakiej innej zależności tutaj brakuje. Dziwne.
Mark Russell
2
Ponieważ możesz uruchomić go po uruchomieniu, musimy pominąć inną zależność od usługi. Jednym z brudnych hacków, które mogą zadziałać (ale wcale nas nie sleep 10oświecą ) jest po prostu dodanie - lub wyżej - „skryptu przed uruchomieniem” przed wykonaniem skryptu powłoki.
Mark Russell
Przepraszamy Mark - ale jesteśmy na tej samej stronie. Próbowałem spać 10 rzeczy już w skrypcie przedstartowym. Nie idź Następnie spróbowałem całkowicie usunąć plik debug.log i zrestartować komputer. Po uruchomieniu miałem ten sam status usługi i nie miałem pliku debug.log, więc nie jestem przekonany, że PMS jest w ogóle uruchamiany. Czy istnieje prosty sposób na zdiagnozowanie tego? Jeśli zmienię PMS.sh, aby wypluł jakieś dane wyjściowe, gdzie to pójdzie? Przypuszczam, że zawsze mógłbym skierować go do własnego pliku - może to dać szansę.
Kent Boogaart
Właśnie zaktualizowałem swoje pytanie o więcej informacji.
Kent Boogaart
3

Po sprawdzeniu syslogu proces pms rozpoczyna się bez błędów, ale po krótkiej chwili jego cel zmienia się od początku do końca, co oznacza, że ​​został zabity.

Jest to nieco dziwne, ponieważ dodałeś klauzulę repsawn, więc powinna spróbować rozpocząć od nowa po zatrzymaniu, ale nigdy tak nie jest. Więc zgaduję, że usunąłeś klauzulę odrodzenia.

Pomiędzy uruchomieniem i zatrzymaniem usługi pms uruchamiane są tylko 2 usługi ufw i interfejs sieciowy (eth0), a 1 uruchamiana jest udev-fallback-graphic.

Wygląda na to, że proces pms jest uruchamiany równolegle. Niestety dokumentacja wstępna jest nieco mglista na temat dokładnych różnic między start on ...wanilią start on starting ...a start on started ....

Spróbuj zmienić sekcję startową na

start on started networking

lub po prostu

start on net-device-up IFACE=eth0

Dane wyjściowe dziennika są nieco dziwne, ponieważ zdarzenie net-device-up przychodzi znacznie później, ale pms zaczyna się przed nim.

Powinno to zapewnić, że proces rozpocznie się dopiero po zakończeniu całej konfiguracji sieci, tj. Zadanie nie tylko się rozpoczęło, ale zakończyło.

Nie ufaj także całkowicie logowi, wczesne uruchamianie procesu logowania do dowolnego pliku nie zawsze działa. Zobacz odpowiedź w Debugowaniu Upstart

Ciaran Liedeman
źródło
3

Udało się rozwiązać podobny problem, używając zamiast tego polecenia start na poziomie uruchamiania:

start on runlevel [2345]
Laurynas
źródło
3

Miałem ten sam problem i ostatecznie rozwiązałem go po prostu za pomocą:

start on runlevel [2345]

bez net-device-uplub started networkingrzeczy

Jest to kompletny skrypt wstępny i działa idealnie:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log
Daniele B.
źródło
1

Natknąłem się chkconfigpodczas mojego szkolenia RHCSA / CE:

sudo apt-get install chkconfig
sudo chkconfig pms on

Możesz sprawdzić stronę man Oneiric, aby uzyskać więcej informacji na temat jego możliwości.

Oxwivi
źródło
1

Znalazłem rozwiązanie tego, ale nie rozumiem tego. Jeśli przeniosę PMS zi /home/administratordo /bin/pmsroota jako właściciela, wszystko działa dobrze.

Jeśli zostawiam to poniżej, /home/administrator/ale upewniam się, że root jest właścicielem wszystkiego na pasku samego /home/administrator/katalogu, nadal nie działa.

Jeśli ustawię administratora jako właściciela wszystkiego i zmienię odpowiednią część mojego skryptu na:

sudo su administrator -c '/home/administrator/pms-current/PMS.sh'

To wciąż nie działa.

Przypuszczam, że na razie utworzę /home/root/katalog i przeniosę tam wszystko, choć naprawdę chciałbym to w pełni zrozumieć.

Kent Boogaart
źródło
Więc to chkconfigteż nie działało? Czy próbowałeś podać katalog PMS.shjako root? Jeśli tylko twoje rozwiązanie działa, to przejdź do strony Launchpad Upstart i skontaktuj się bezpośrednio z deweloperami.
Oxwivi,
A jeśli wystarczy tylko przenieść, to .shpo prostu zostaw tam wszystko i edytuj skrypt, aby wskazywał ten katalog (a może nawet zmienić katalog?).
Oxwivi
Tak, próbowałem stworzyć cały katalog PMS należący do roota. Prawdopodobnie nie działało, ponieważ / home / administrator / nie jest własnością root.
Kent Boogaart
To i tak nie ma sensu, regularnie uruchamiam skrypty w moim katalogu / home przez upstart bez problemów, dziwne.
umów się
Jeszcze dziwniejszy: po prostu wypróbowałem wszystko w katalogu / home / root /, który oczywiście jest własnością root. Nie działało Przeniosłem wszystko z powrotem pod / bin / pms i znów zadziałało. Wygląda więc na to, że próba uruchomienia PMS spod / home nie działa w moim systemie.
Kent Boogaart
1

Miałem podobny problem z brakiem uruchomienia, gdy zdałem sobie sprawę, że mój skrypt zależy od pliku znajdującego się w moim domu, a dom nie był dostępny, ponieważ został zaszyfrowany standardowym mechanizmem ubuntu (.Private).

start on local-filesystems zdarzenie jest (prawdopodobnie) emitowane przed zakończeniem procesu deszyfrowania.

alessandro
źródło
1

Czy twój katalog domowy na NFS? Czasami root nie może uzyskać dostępu do NFS.

Dla przypomnienia, w moim małym teście właśnie 12.04:

  • start on started networkingi start on network-interface-up INTERFACE=eth0 nie działają, ale

  • start on started network-interface INTERFACE=eth0 robi.

Dzięki http://os4.org/wiki/upstart.html za zwrócenie uwagi, że initctl list zawsze pokazuje sieć zadań jako zatrzymaną.

użytkownik94311
źródło
Odnośny link jest uszkodzony.
slm
0

Podobnie jak @xuhcc, przyszedłem tutaj, aby dowiedzieć się, dlaczego mój skrypt Vagrant Upstart nie był uruchomiony. Powinno działać:

zacznij od włóczęgów

Ale nie występuje w niektórych wersjach z powodu następującego błędu.

https://github.com/mitchellh/vagrant/issues/6074

Obejście wymienione w raporcie było dla mnie świetne:

$ cat /etc/init/workaround-vagrant-bug-6074.conf 
# workaround for https://github.com/mitchellh/vagrant/issues/6074
start on filesystem
task

env MOUNTPOINT=/vagrant

script
  until mountpoint -q $MOUNTPOINT; do sleep 1; done
  /sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=$MOUNTPOINT
end script

Działa dla mnie świetnie

Ian E.
źródło
0

zadziałało dla mnie (muszę uruchomić usługę po iface up):

start on started networking and net-device-up IFACE=wlan1 
stop on shutdown

respawn
respawn limit 10 10
MSS
źródło