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?

比尔 盖子
źródło
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.

SimonPe
źródło
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.

Hack 5
źródło
-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.
Pavel A.
źródło
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,