Nie mogę znaleźć prawidłowego sposobu wykonywania niektórych skryptów lokalnych (lub bardzo lokalnych poleceń) w systemiedd, już wiem, że nie mogę tworzyć usługi (w jednostce systemd) dla tego rodzaju skryptów (czy muszę?) ....
Obejściem, które znalazłem, jest utworzenie pliku rc.local i nadanie mu uprawnień do wykonywania.
printf '#!/bin/bash \n\nexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Na przykład, jeśli otrzymam starszy serwer z skonfigurowanym przez Ciebie prostym plikiem rc.local, będę wiedział, co zrobiłeś i ile to zaszkodzi, aby zaktualizować lub zainstalować coś nowego w dystrybucji, ponieważ rc.local był przestrzegany przez zewnętrzny pakietów, ale z drugiej strony, jeśli zainstaluję serwer i utworzę jednostkę systemową lub dwie lub trzy (lub nawet usługi sysvinit), po prostu za wykonanie prostego zadania, może to czasem utrudnić ci życie, a nawet znacznie więcej nazwy mogą pewnego dnia kolidować z nazwami nowych usług tworzonych przez programistę dystrybucji, a być może instalowanych podczas aktualizacji, powodując problemy z moimi skryptami!
Widzę inne pytanie z pytaniem, gdzie jest rc.local, a odpowiedzią było, aby go utworzyć i dać uprawnienia do wykonywania, myślę, że moje pytanie tak naprawdę nie jest duplikatem , ponieważ nie chcę wiedzieć, gdzie to jest - uwierz mi, chcę tylko aby przyjąć , że jest przestarzałe , ale nie mogę znaleźć właściwą drogę do wykonywania tego rodzaju rzeczy, mam naprawdę stworzyć jednostkę tylko kilka prostych takiego?
Odpowiedzi:
Jak wskazano gdzie indziej, staje się nieczysty umiarkowanie używać
rc-local.service
mocysystemd
.poweroff
/reboot
polecenia, z których korzysta wiele osób).rc-local.service
jeden sposób, ale Debian udostępnia plik rozwijany, który zmienia co najmniej jedno ważne ustawienie.rc-local.service
często może dobrze działać. Jeśli martwisz się powyższym, wszystko, co musisz zrobić, to zrobić własną kopię! Oto magia:Nie sądzę, że musisz zrozumieć każdy szczegół [*], ale tutaj musisz wiedzieć dwie rzeczy.
Musisz to włączyć za pomocą
systemctl enable my-startup.service
.Jeśli twój skrypt jest zależny od jakiejkolwiek innej usługi, w tym
network-online.target
, musisz ją zadeklarować. Np. Dodaj[Unit]
sekcję z liniamiWants=network-online.target
iAfter=network-online.target
.Nie musisz martwić się o zależności od usług „wczesnego rozruchu” - w szczególności usług już zamówionych wcześniej
basic.target
. Usługi takiemy-startup.service
są automatycznie zamawiane późniejbasic.target
, chyba że zostaną ustawioneDefaultDependencies=no
.Jeśli nie masz pewności, czy jedna z twoich zależności jest usługą „wczesnego rozruchu”, jednym z podejść jest wyświetlenie listy usług zamówionych wcześniej
basic.target
, poprzez uruchomieniesystemctl list-dependencies --after basic.target
. (Uwaga, że--after
nie--before
).Są pewne uwagi, które moim zdaniem dotyczyły również systemu wstępnego
rc.local
:rc.local
.[*] Użyłem
Type=oneshot
+,RemainAfterExit=yes
ponieważ ma to większy sens w przypadku większości skryptów jednorazowych. Formalizuje to, że uruchomisz serię poleceń, któremy-startup
zostaną wyświetlone jako „aktywne” po ich zakończeniu, i że nie uruchomisz demona.źródło
.service
jednostka systemowa lub jeśli naprawdę chcesz napisać skrypt inicjujący LSB, możesz to zrobić zamiast tego. Nie chciałem zalecać umieszczania kilku demonówrc-local.service
lub równoważnych, myślę, że to prawdopodobnie działa, ale wydaje się o wiele przyjemniej, jeśli możesz zrestartować indywidualnego demona za pomocąsystemctl restart my-daemon
czegoś podobnego. Zamierzasz umieścić swoje lokalne usługi/etc/systemd/system
.local-
...Type=oneshot
... formalizuje to, że ... nie uruchomisz demona. Jeśli chcesz uzyskać informacje na temat uruchamiania demona, zadaj nowe pytanie.Zapomnij o
rc.local
.Jak powiedziałem o CentOS 7 i Debianie 8 oraz Ubuntu 15 :
Używasz systemu systemd + Linux.
/etc/rc.local
jest podwójnym mechanizmem zgodności wstecznej w systemd, ponieważ jest to mechanizm zgodności wstecznej dla mechanizmu, który sam był mechanizmem zgodności w klonie van 5 Smoorenburga Systemrc
.Używanie
/etc/rc.local
może pójść okropnie źle. Ludzie byli zaskoczeni faktem, że systemd nie działarc.local
w taki sam sposób, w tym samym miejscu w bootstrapie, do którego są przyzwyczajeni. (Lub błędnie się spodziewałem: w rzeczywistości nie działał ostatni w starym systemie, jak wciąż wskazuje podręcznik OpenBSD.) Inni byli zaskoczeni faktem, że skonfigurowali się,rc.local
oczekując starych sposobów robienia rzeczy, następnie całkowicie cofnięta przez m.in. nowychudev
przepisów, NetworkManager,systemd-logind
,systemd-resolved
, lub różne „zestaw” s.Jak pokazano na przykładzie „ Dlaczego„ init 0 ”powoduje„ Nadmiar argumentów ”podczas instalacji Arch? ”, Niektóre systemy operacyjne już zapewniają systemd bez funkcji kompatybilności wstecznej, takich jak
systemd-rc-local-generator
generator . Podczas gdy Debian nadal zachowuje funkcje kompatybilności wstecznej , Arch Linux buduje systemd z wyłączonymi . Tak więc w Arch i takich systemach operacyjnych oczekuje/etc/rc.local
się całkowitego zignorowania .Zapomnij o
rc.local
. To nie jest droga. Masz systemd + system operacyjny Linux. Stwórz więc odpowiednią usystematyzowaną jednostkę usługową i nie zaczynaj od punktu, który dzieli dwa poziomy kompatybilności wstecznej. (W Ubuntu i Fedorze jest trzy razy usuwany,rc
klon van Smoorenburg System 5 ,rc.local
który następnie został dwukrotnie zastąpiony ponad dziesięć lat temu, najpierw przez start-up, a następnie przez systemd.)Pamiętaj także o pierwszej regule migracji do systemd .
To nie jest nawet nowy pomysł, który jest specyficzny dla systemd. W systemach van Smoorenburg
rc
i Upstart trzeba było zrobić odpowiednirc
skrypt van Smoorenburg lub plik zadania Upstart, a nie używaćrc.local
. Nawet podręcznik FreeBSD zauważa, że w dzisiejszych czasachrc
zamiast korzystać z niego, tworzy się odpowiedni skrypt Mewburn/etc/rc.local
. Mewburnrc
został wprowadzony przez NetBSD 1.5 w 2000 roku./etc/rc.local
pochodzi z czasów wydania Siódmej Edycji Unix i wcześniejszych. Został on zastąpiony przez/etc/inittab
ATlevrc
i Unix System 3 oparty na poziomie pracy (nieco inny/etc/inittab
w AT&T Unix System 5) w 1983 roku . Nawet to jest teraz historią.Utwórz właściwe natywne definicje usług dla systemu zarządzania usługami, niezależnie od tego, czy będzie to pakiet usług dla zestawu narzędzi nosh
service-manager
isystem-control
,/etc/rc.d/
skrypt dla Mewburnrc
, plik jednostki usługi dla systemd, plik zadania dla Upstart, katalog usługi dla runit / s6 / daemontools -cencore, a nawet/etc/init.d/
scenariusz do van Smoorenburgarc
.W systemie takie pliki dodane przez administratora są
/etc/systemd/system/
zwykle (lub/usr/local/lib/systemd/system/
rzadko). Dzięki menadżerowi usług nosh,/var/local/sv/
jest konwencjonalnym miejscem dla lokalnych pakietów usług. Używa Mewburnrc
na FreeBSD/usr/local/etc/rc.d/
. Pliki spakowanych jednostek usług i pakiety usług, jeśli je tworzysz, to jednak idź w różne miejsca.Dalsza lektura
rc.local
. Podręcznik FreeBSD System Manager . 23.04.2016./etc/rc.local
lubchmod -x
to . Błąd Redhat # 734268.rc.local
zaczyna się wcześnie . błąd systemd # 7703rc.local
. bencane.com./etc/inittab
należy już do przeszłości. . Często udzielane odpowiedzi.systemd.unit
stronie podręcznika ”. Errata dla systemd doco . Często udzielane odpowiedzi.źródło
Podsumowanie https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
Utwórz /etc/systemd/system/rc-local.service:
Następnie:
Sprawdź z:
źródło
StandardOutput=journal+console
(w twoim przykładzie konsola jest odpowiednikiem tty), co wydaje się bardziej przydatne w rozwiązywaniu problemów. WSysVStartPriority=
pewnym momencie usunięto także obsługę dla . Może mógłbyś skomentować, jak ważneSysVStartPriority=
jest, lub go usunąć. Poza tym jest to przyzwoita odpowiedź.