Od init.d do początku, czy istnieje most?

11

Mam doskonale dobry skrypt do użycia w /etc/init.d. W rzeczywistości mam ich wiele, wszystkie stworzone za pomocą Tanuki Java Service Wrapper.

Wydaje mi się, że mógłby istnieć prosty szablon do zawijania takiego skryptu powłoki jako skryptu początkowego, ale trochę googlingu nie ujawnia.

Czy coś brakuje?

bmargulies
źródło

Odpowiedzi:

9

Nie przypominam sobie, żeby widziałem do tego szablon. Jest to jednak trochę ironiczne, że technicznie rzecz biorąc, jego początkowe uruchomienie od początku skryptu init.d jest możliwe dzięki zadaniu rc i rcS kompatybilności wstecznej.

Zastanowiłbym się nad przepisaniem czegokolwiek, co masz na początek, jednak wiem, że niektóre skrypty są trudne do przekonwertowania, więc oto, co zrobiłem przez chwilę na niektórych moich skryptach:

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

Teraz, w zależności od charakteru usługi, bez względu na to, czy jest ona trwała, czy rozwidla się, może być konieczne dodanie expect forklub taskdo pliku zadania.

Aby dokończyć myśl, zwykle jest to wszystko, co jest do pełnego pliku zadania wstępnego. Cała praca przed uruchomieniem jest wykonywana, wszystkie czyszczenie jest wykonywane, jedyne, co pozostało, to sama usługa, która jest zwykle dodawana z:

exec service_cmd
KFro
źródło
Na początku dokumentacja mówi, że poziomy uruchamiania 3,4 i 5 są nieużywane. Powinieneś więc użyć poziomu uruchamiania 2.
djangofan,
minęło trochę czasu, ale jestem prawie pewien, że 5 ma system z uruchomionym GUI, przynajmniej kiedyś.
Joseph Rogers
6

Tak więc jednym z punktów zadań upstart jest łatwość pisania.

W skryptach init.d jest wiele magicznych skryptów powłoki, które powtarzają się w kółko. Instrukcje przypadków, śledzenie pliku pidfile, wiersze komentarza lsb. Nie jest bardzo jasne, jak napisać DOBRY skrypt init.d bez przeczytania go.

Jeśli masz już problem z napisaniem tego wszystkiego, nie potrzebujesz pracy dla początkujących, chyba że, jak wspomniałem w innym komentarzu, zależysz od innej pracy / wydarzenia dla początkujących.

Ale tak naprawdę upstart sprawia, że ​​wszystko jest naprawdę proste. Nie powinieneś potrzebować wstępnego uruchomienia, chyba że musisz skonfigurować takie rzeczy, jak tmpdirs, ulimits lub argumenty środowiska uruchomieniowego. Nie powinieneś potrzebować post-postu, chyba że chcesz się upewnić, że posprzątasz po usłudze (usługa naprawdę powinna sprzątać po sobie przy normalnym wyjściu).

Często gigantyczny skrypt init.d z wieloma opcjami sprowadza się do zadania rozpoczynającego się od 10 do 15 linii. Najbardziej skomplikowane skrypty init.d mogą wrzucić większość logiki do przedstartowych. Kluczem jest to, że jest to tylko mały fragment kodu, aby skonfigurować środowisko dla procesu, a nie logika w obsłudze start / stop / respawn / etc.

Najtrudniejsza i najczęściej popełniana przez ludzi pomyłka to wiedza, kiedy rozpocząć / zakończyć pracę. start on runlevel [2345]wydaje się logiczne, ale ignoruje fakt, że sieć pojawia się równolegle w tym punkcie, podobnie jak montowanie lokalnego systemu plików. Kluczem jest, aby spróbować dokładnie określić minimum potrzebnych rzeczy (inne usługi, systemy plików, sieć itp.), Aby uruchomić, i rozpocząć, gdy zostaną wykonane. Powinna wystarczyć większość tradycyjnych usług sieciowych start on (local-filesystems and net-device-up IFACE!=lo).

Spamapy
źródło
3

Myślałem, że Upstart zachowuje kompatybilność wsteczną ze skryptami inicjującymi typu SysV w /etc/init.d. Powinieneś móc po prostu używać niezmienionych skryptów init.

Ryan C. Thompson
źródło
Tak, ale kolejność nie jest już tak łatwa do przewidzenia. Zadania upstart mogą być uruchamiane przed / po uruchomieniu skryptu rc2.d / S99mything. Tak więc, jak tylko będziesz polegać na usłudze zarządzanej przez upstart, potrzebujesz zadania upstart.
SpamapS
2
Jak hack, można usunąć skrypty startowe z poszczególnych poziomów pracy, a zamiast tego dodać kilka wierszy jak /etc/init.d/myservice startsię /etc/rc.localw odpowiedniej kolejności. Zapewni to, że Twoje usługi będą uruchamiane jako ostatnie, po wszystkich innych usługach, w tym tych, które zostały uruchomione przez skrypty inicjujące Upstart.
Ryan C. Thompson