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 init
są 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 .
cat /var/log/syslog | grep init
po włączeniu rejestrowania rozruchu w celu uruchomienia przy użyciu instrukcji z Upstart DebuggingOdpowiedzi:
Poleciłbym zwiększenie gadatliwości zadania, np. Poprzez użycie wpisów przed rozpoczęciem / po uruchomieniu.
Więcej informacji na stronie http://upstart.ubuntu.com/cookbook/
Zajrzyj również na http://upstart.ubuntu.com/wiki/Debugging
źródło
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:
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 .:
W Oneiric (11.10) można użyć zdarzenia
static-network-up
do 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/interfaces
zamiast NetworkManagera. Nie oznacza to statycznego w znaczeniu statycznego adresu IP vs. DHCP.]źródło
lo
ieth0
ale 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.sleep 10
oświecą ) jest po prostu dodanie - lub wyżej - „skryptu przed uruchomieniem” przed wykonaniem skryptu powłoki.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 ...
astart on started ...
.Spróbuj zmienić sekcję startową na
lub po prostu
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
źródło
Udało się rozwiązać podobny problem, używając zamiast tego polecenia start na poziomie uruchamiania:
źródło
Miałem ten sam problem i ostatecznie rozwiązałem go po prostu za pomocą:
start on runlevel [2345]
bez
net-device-up
lubstarted networking
rzeczyJest to kompletny skrypt wstępny i działa idealnie:
źródło
Natknąłem się
chkconfig
podczas mojego szkolenia RHCSA / CE:Możesz sprawdzić stronę man Oneiric, aby uzyskać więcej informacji na temat jego możliwości.
źródło
Znalazłem rozwiązanie tego, ale nie rozumiem tego. Jeśli przeniosę PMS zi
/home/administrator
do/bin/pms
roota 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:
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ć.źródło
chkconfig
też nie działało? Czy próbowałeś podać katalogPMS.sh
jako root? Jeśli tylko twoje rozwiązanie działa, to przejdź do strony Launchpad Upstart i skontaktuj się bezpośrednio z deweloperami..sh
po prostu zostaw tam wszystko i edytuj skrypt, aby wskazywał ten katalog (a może nawet zmienić katalog?).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.źródło
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 networking
istart on network-interface-up INTERFACE=eth0
nie działają, alestart 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ą.źródło
W moim przypadku usługa wstępna zależała od skryptu znajdującego się w folderze zsynchronizowanym . Rozwiązano problem za pomocą następującego wiersza:
Więcej informacji: http://razius.com/articles/launching-services-after-vagrant-mount/
źródło
Podobnie jak @xuhcc, przyszedłem tutaj, aby dowiedzieć się, dlaczego mój skrypt Vagrant Upstart nie był uruchomiony. Powinno działać:
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:
Działa dla mnie świetnie
źródło
zadziałało dla mnie (muszę uruchomić usługę po iface up):
źródło