Na StackOverflow pojawiło się pytanie o pisanie init.dskryptów w Pythonie. Jeden komentarz wskazał, że te skrypty powinny być programowane w powłoce, a nie w języku Python. Czy pisanie init.dskryptów w Pythonie:
Zły. Zły. Zły. Nigdy tego nie rób.
Nie jest to zalecana praktyka.
OK, z zastrzeżeniami.
Dziedzictwo dogmat.
Całkowicie w porządku.
Byłoby wspaniale poznać wszelkie scenariusze koszmarów lub gdyby zasada ta została zapisana krwią jakiegoś sysadmina.
Powiedziałbym # 2, ale bardzo blisko # 1 - „Złe. Złe. Złe. Nigdy tego nie rób”. Standard, taki jaki jest, dla skryptów inicjujących Linuksa znajduje się w LSB i chociaż nigdy nie wychodzi i mówi „są to skrypty powłoki Bourne'a”, przyjmuje się kilka założeń. Po pierwsze, że wiersze zaczynające się od # są komentarzami, zdarza się, że działają dobrze. Bardziej problematyczny jest wymóg, aby skrypt inicjujący wykonywał polecenia z /lib/lsb/init-functions„w bieżącym środowisku (patrz specjalna specjalna wbudowana kropka polecenia)”.
Ale co ważniejsze, jeśli robisz tutaj coś naprawdę skomplikowanego, robisz to źle. Skrypty inicjujące powinny być bardzo proste i użyteczne. Powinny to być skrypty w klasycznym znaczeniu, a nie programy. Lepiej jest go wyssać i stworzyć prosty skrypt powłoki, który każdy sysadmin może łatwo wywołać jednym szybkim spojrzeniem, niż zrobić coś pięknego i zaprojektowanego w Pythonie.
Inną kwestią, o której należy pamiętać systemd, może być przyszłość inicjalizacji całego systemu w systemie Linux. W systemie systemowym inicjowanie odbywa się za pomocą prostych plików konfiguracyjnych, a nie skryptów, przy czym idea polega na tym, że wszystkie programy startowe pasują do kilku standardowych wzorców projektowych i naprawdę powinieneś wybrać jeden. Jeśli program używa czegoś skomplikowanego do inicjalizacji, powinno to wykraczać poza sam skrypt inicjujący.
Idę z tą odpowiedzią. Chodzi o to, że Python nie jest konieczny i nie jest standardem, i jako taki może stworzyć dodatkowy punkt debugowania niepewności i dodatkowy punkt awarii. Odnosząc się do pierwotnego pytania SO, rozumiem, że takie skrypty mogą uruchamiać demony, ale nie powinny one być rzeczywistymi demonami.
mjhm,
jeśli pamiętam, nie wszystkie dystrybucje podążają za LSB. patrz debian.
Massimo,
10
Nie widzę z tym problemu, jeśli na pewno wiesz, że interpreter Pythona będzie dostępny podczas uruchamiania skryptu init.d. To, dla mnie, wskazuje, że patrzysz na coś, co zostało zrobione stosunkowo późno na poziomie uruchamiania dla wielu użytkowników (lub „konsoli graficznej”).
Jednak ... Oznacza to, że konkretna wersja interpretera Pythona MOŻE być istotna dla sekwencji rozruchowej i jest to jeszcze jedna rzecz, którą musisz sprawdzić przy aktualizacjach.
To chyba oznacza, że mówię „3. OK, z zastrzeżeniami”.
+1. Dokładnie to, co pisałem. Jedynymi „problemami” byłoby zapewnienie zgodności z LSB (np. Zapewnienie niezbędnych funkcji) i upewnienie się, że potrzebny interpreter Pythona jest dostępny w czasie wykonywania (i nie jest uszkodzony).
Sam Halicke
3
Dostępność w czasie wykonywania może być skomplikowana, jeśli użytkownik zdecyduje się na opcję / usr na osobnej partycji. Ważne będzie, aby skrypt działał po zamontowaniu / usr, ponieważ python jest zwykle instalowany w / usr.
Zoredache,
@Zoredache - Ayup. Zazwyczaj wiesz, że „zdarzyło się”, gdy spóźniasz się w sekwencji RC „wielu użytkowników”.
Vatine
2
Zgadzam się z „3. OK, z zastrzeżeniami”, ale z różnych powodów. Moje doświadczenie w Solarisie polegało na tym, że mieli kopię systemu operacyjnego dla Perla dla niektórych swoich programów wewnętrznych. Skrypt powłoki był niczym więcej jak powłoką, aby Perl mógł rozpocząć. Czy skrypt startowy musiał być napisany w sh? Nie, ale poprawiło to łatwość konserwacji dla administratora. I skrypt inicjujący nie zrobił nic bardziej skomplikowanego w takich rzeczach jak daemon --startlub daemon --stop. Jeśli to zrobisz, zwykli użytkownicy mogą uruchomić narzędzie w trybie nieuprzywilejowanym, jeśli ma to sens w kontekście twojego programu. I nie musieliby mieć różnego rodzaju skomplikowanych ustawień, aby uzyskać finezję.
Nowoczesne dystrybucje Linuksa, nawet te nadal używane init.d, mają dużą kolekcję gotowych funkcji, które mają ułatwić zarządzanie demonami. Graficzne procesy rozruchowe rutynowo wykorzystują te funkcje, aby utrzymać ładne logo, chyba że jeden ze skryptów startowych zacznie wyrzucać błędy. Twój kod Python (lub inny język) może nie działać dobrze z tymi schematami.
Jeśli nie dbasz o estetykę lub łatwość konserwacji, skrypt inicjujący można napisać w dowolny sposób. Widziałem wielu administratorów, którzy nie potrafią nawet odpowiednio wyciąć i wkleić, całkowicie ignorują argumenty wiersza poleceń i po prostu uruchamiają demona. Bez zamykania, statusu lub restartu. To było niedojrzałe, ale ich kod wciąż działał.
Mówię między nr 1-2. LSB kieruje cię w ten sposób .. i od Sys-Admin (bez roli dewelopera) dyktowanie zadania wymaga wiedzy sh / bash, a NIE poziomu deweloperskiego (a nawet lekkiego rozumienia) Pythona, PHP lub perla. To dotyczy stosu LAMP, a nie systemowych skryptów inicjujących.
Nie widzę z tym problemu, jeśli na pewno wiesz, że interpreter Pythona będzie dostępny podczas uruchamiania skryptu init.d. To, dla mnie, wskazuje, że patrzysz na coś, co zostało zrobione stosunkowo późno na poziomie uruchamiania dla wielu użytkowników (lub „konsoli graficznej”).
Jednak ... Oznacza to, że konkretna wersja interpretera Pythona MOŻE być istotna dla sekwencji rozruchowej i jest to jeszcze jedna rzecz, którą musisz sprawdzić przy aktualizacjach.
To chyba oznacza, że mówię „3. OK, z zastrzeżeniami”.
źródło
Zgadzam się z „3. OK, z zastrzeżeniami”, ale z różnych powodów. Moje doświadczenie w Solarisie polegało na tym, że mieli kopię systemu operacyjnego dla Perla dla niektórych swoich programów wewnętrznych. Skrypt powłoki był niczym więcej jak powłoką, aby Perl mógł rozpocząć. Czy skrypt startowy musiał być napisany w sh? Nie, ale poprawiło to łatwość konserwacji dla administratora. I skrypt inicjujący nie zrobił nic bardziej skomplikowanego w takich rzeczach jak
daemon --start
lubdaemon --stop
. Jeśli to zrobisz, zwykli użytkownicy mogą uruchomić narzędzie w trybie nieuprzywilejowanym, jeśli ma to sens w kontekście twojego programu. I nie musieliby mieć różnego rodzaju skomplikowanych ustawień, aby uzyskać finezję.Nowoczesne dystrybucje Linuksa, nawet te nadal używane
init.d
, mają dużą kolekcję gotowych funkcji, które mają ułatwić zarządzanie demonami. Graficzne procesy rozruchowe rutynowo wykorzystują te funkcje, aby utrzymać ładne logo, chyba że jeden ze skryptów startowych zacznie wyrzucać błędy. Twój kod Python (lub inny język) może nie działać dobrze z tymi schematami.Jeśli nie dbasz o estetykę lub łatwość konserwacji, skrypt inicjujący można napisać w dowolny sposób. Widziałem wielu administratorów, którzy nie potrafią nawet odpowiednio wyciąć i wkleić, całkowicie ignorują argumenty wiersza poleceń i po prostu uruchamiają demona. Bez zamykania, statusu lub restartu. To było niedojrzałe, ale ich kod wciąż działał.
źródło
Mówię między nr 1-2. LSB kieruje cię w ten sposób .. i od Sys-Admin (bez roli dewelopera) dyktowanie zadania wymaga wiedzy sh / bash, a NIE poziomu deweloperskiego (a nawet lekkiego rozumienia) Pythona, PHP lub perla. To dotyczy stosu LAMP, a nie systemowych skryptów inicjujących.
źródło