Jak zrobić usługę systemową jako ostatnią usługę przy rozruchu?


26

Wiele lat temu możemy napisać nasz skrypt startowy /etc/rc.local. Po załadowaniu wszystkich usług systemowych skrypt zostanie uruchomiony.

Teraz używamy systemd, nie mamy rc.localjuż. Systemd uruchamia usługę równolegle. Możesz napisać własną usługę, aby działała rc.local`, ale nie możesz upewnić się, że będzie działać po załadowaniu wszystkich usług systemowych.

Czy jest na to sposób? Czy musimy użyć Beforei Afterw usłudze systemowej pliku?



5
Systemd, nie Upstart !!
31 盖子

Podaj nazwę i wersję systemu operacyjnego?
STTR

System operacyjny: Arch Linux, Wersja: N / A
比尔 盖子

1
@ 比尔 盖子 Dlaczego „last”, nie znasz zależności skryptu, czy chcesz, aby trwało to po prostu dla bezpieczeństwa?
Paul

Odpowiedzi:


27

W systemie zaleca się korzystanie z usług Before=i porządne zamawianie ich After=wokół innych.

Ale ponieważ poprosiłeś o sposób bez użycia Beforei After, możesz użyć:

Type=idle

co man systemd.servicewyjaśnia:

Zachowanie idlejest bardzo podobne do simple; jednak faktyczne wykonanie programu serwisowego jest opóźnione do momentu wysłania wszystkich aktywnych zadań. Można tego użyć, aby uniknąć przeplotu danych wyjściowych usług powłoki z danymi wyjściowymi statusu na konsoli. Należy zauważyć, że ten typ jest przydatny tylko w celu poprawy wydajności konsoli, nie jest użyteczny jako ogólne narzędzie do zamawiania jednostek, a działanie tego rodzaju usługi podlega limitowi czasu 5s, po którym i tak wywoływany jest program serwisowy.


1
Cześć, czy zechciałby pan opracować składnię, gdybym miał użyć jej przed czy po?
r4ccoon

Nieco inny temat, ale jeśli ktoś chce uruchamiać procesy użytkownika oddzielnie od procesów systemowych, jest askubuntu.com/a/859583/457417
Ben Creasy

pracował idealnie do zestawu /proc/sys/kernel/modules_disabled, aby 1pod koniec procesu ładowania
Stuart Cardall

0

To naprawdę zależy od twojej definicji „bootowanego”. Zakładam, że chcesz, aby działał natychmiast po uruchomieniu getty. Aby to zrobić, musisz dodać swoją usługę do /etc/systemd/system/getty.target.wants/katalogu. Należy również upewnić się, że plik używa kodu podobnego do innych usług w tym katalogu. Aby uruchomić niestandardową usługę przy uruchamianiu i zamykaniu systemu (wystarczy wydać sygnał dźwiękowy brzęczyka płyty głównej), używam następującego skryptu/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh jest wykonywalny i ma shebang na początku.

Zauważ, że nie wszystko rozpocznie się w tym momencie bootowania, ale w tym momencie użytkownik wyświetla monit

Chociaż to się przydaje Before=i After=było dla mnie o wiele bardziej zrozumiałe i faktycznie działa; Nie znalazłem powyższej odpowiedzi wystarczająco pouczającej. Pozwala to również na korzystanie z obu tych opcji ExecStart=i ExecStop=nie ogranicza się Type=simpledo usługi podobnej do podobnej.


-2

Nie znam się na szczegółach ani ArchLinux, ale oto jak ogólnie zarządzać systemem.

Zasadniczo systemd to zbiór skryptów w /etc/init.d/, które są wskazywane przez dowiązania symboliczne z /etc/rcX.d, gdzie X jest liczbą poziomów uruchamiania. Same dowiązania symboliczne mają następujący format:

[K | S] + nn + [ciąg]

gdzie:

  • nn to liczba określająca kolejność uruchamiania tych skryptów
  • string to nazwa skryptu wyświetlana w /etc/init.d/
  • i wreszcie K lub S określają polecenie, przy pomocy którego skrypt jest wywoływany: odpowiednio stop lub start.

Jeśli więc chcesz, aby skrypt był uruchamiany jako ostatni w sekwencji rozruchowej, musisz wykonać następujące czynności:

  1. umieść skrypt w /etc/init.d/ i uczyń go wykonywalnym
  2. określ docelowy poziom uruchamiania, od którego skrypt powinien się uruchamiać (typowo 2 dla konsoli i 5 dla graficznego interfejsu użytkownika). Można to ustalić za pomocą czegoś takiegorunlevel
  3. sprawdź, jakie skrypty są już na tym poziomie pracy ls /etc/rc<target runlevel>.d/i wybierz dwucyfrową liczbę, która jest większa niż jakikolwiek inny już tam dostępny.
  4. używając narzędzia specyficznego dla twojej dystrybucji, takiego jak update-rc.doparte na Debianie lub podobne chkconfigdo Fedory lub ręcznie, utwórz dowiązanie symboliczne /etc/rc.d/S do skryptu inicjującego.

5
To, co opisałeś, to tak naprawdę sysVinit. Chociaż prawdą jest, że systemd jest zgodny z działaniem sysVinit, jest jedna kluczowa różnica - wszystko odbywa się równolegle. Istnieją również dwa rodzaje usług, usługi sysVinit i usługi systemowe. Twoja odpowiedź może pomóc wykonać coś po usługach sysVinit, ale niekoniecznie tych systemowych.
Sam

1
Systemd wcale nie stara się być kompatybilny z sysvinit od samego początku.
lzap,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.