Jak uruchomić program Linux przy starcie z systemd
Opublikowany: 2022-01-29Chcesz uruchomić program Linux przy starcie? Oprogramowanie systemd zapewnia sposób na zrobienie tego w dowolnej dystrybucji Linuksa z systemd - co jest obecnie większością z nich, w tym Ubuntu. Przeprowadzimy Cię przez proces tworzenia zintegrowanej usługi — a nawet rozmawia z dziennikiem.
Ten samouczek pokazuje, jak skonfigurować usługę systemową, która jest uruchamiana po uruchomieniu systemu. Aby uruchomić program graficzny podczas logowania, użyj menedżera uruchamiania na pulpicie.
Uruchamianie programów przy starcie
Czasami oprogramowanie, które instalujesz na komputerze, łączy się z procesem uruchamiania Linuksa, tak że program jest automatycznie uruchamiany przy każdym uruchomieniu komputera. Możesz łatwo osiągnąć to samo zachowanie za pomocą własnych programów i skryptów, a właściwie każdego innego programu, który jest na twoim komputerze.
Programy uruchamiane przy starcie są kontrolowane przez systemd
, menedżera systemu i usług. systemd
to pierwszy proces uruchamiany przy starcie. Zawsze ma identyfikator procesu (PID) 1. Każdy inny proces uruchomiony na twoim komputerze jest uruchamiany przez systemd
lub przez proces, który systemd
już został uruchomiony.
Programy działające w tle nazywane są demonami lub usługami. Litera „d” na końcu systemd
oznacza demona. W tym artykule stworzymy przykładową usługę. Aby zaznaczyć wszystkie pola, nasza usługa musi być:
- Zintegrowany z
systemd
poprzez plik jednostki usług - Uruchomiony przy starcie
- Sterowanie za pomocą
systemctl
, interfejsu sterującego dlasystemd
- Potrafi pisać do dziennika
Tworzenie Programu Serwisowego
Potrzebujemy programu, który systemd
uruchomi. Stworzymy prosty skrypt o nazwie „htg.sh”. Ten samouczek używa edytora tekstu Gedit, ale możesz użyć dowolnego edytora tekstu.
dotknij htg.sh
gedit htg.sh
Otworzy się edytor gedit
. Skopiuj i wklej następujący tekst do edytora.
#!/kosz/bash echo "htg.service: ## Zaczynam ##" | systemd-cat -p informacje dopóki : robić TIMESTAMP=$(data '+%Y-%m-%d %H:%M:%S') echo "htg.service: znacznik czasu ${TIMESTAMP}" | systemd-cat -p informacje spać 60 Gotowe
Zapisz zmiany i zamknij edytor.
Scenariusz nie robi wiele, ale jest kilka punktów, na które warto zwrócić uwagę.
- Dwie linie
echo
są przesyłane potokiem przezsystemd-cat
, program, który pobiera dane wyjściowe z programu i wysyła je do dziennika. Wpisy do czasopisma mają pierwszeństwo. Używamy opcji-p
(priorytet), aby wskazać, że nasze wiadomości służą wyłącznie do celów informacyjnych (informacyjnych). Nie są to ważne błędy ani ostrzeżenia. - Istnieje nieskończona pętla
while
. - Zmienna
TIMESTAMP
jest ustawiona na bieżącą datę i godzinę. Jest to formatowane do postaci wiadomości i wysyłane do dziennika. - Skrypt następnie śpi przez 60 sekund.
- Po 60 sekundach pętla się powtarza. Tak więc ten skrypt zapisuje wiadomość ze znacznikiem czasu do dziennika raz na minutę.
Skopiujemy skrypt do katalogu /usr/local/bin
.
sudo cp htg.sh /usr/local/bin
I musimy sprawić, by był wykonywalny:
sudo chmod +x /usr/local/bin/htg.sh
Tworzenie pliku jednostki serwisowej
Każdy program uruchamiany przez systemd
ma plik definicji, zwany plikiem jednostek usług. Zawiera to pewne atrybuty, których systemd
może użyć do zlokalizowania i uruchomienia programu oraz do zdefiniowania niektórych jego zachowań.
Musimy utworzyć plik jednostki dla naszej nowej usługi, ale rozsądne jest upewnienie się, że żaden z istniejących plików jednostek nie ma nazwy, którą chcemy nadać naszej nowej usłudze.
sudo systemctl list-unit-files --type-service
Możesz przewijać listę plików jednostek, która jest posortowana alfabetycznie, i sprawdzić, czy nazwa, której chcesz użyć, nie jest zajęta.
Nasz serwis będzie nosił nazwę „htg.service”. Żadne pliki jednostek nie mają takiej nazwy, więc możemy kontynuować i utworzyć nasz plik jednostek.
sudo gedit /etc/systemd/system/htg.service
Otworzy się edytor gedit
. Skopiuj i wklej następujący tekst do edytora:
[Jednostka] Opis = Przykład usługi How-To Geek Chce=sieć.cel After=syslog.target sieć-online.target [Usługa] Typ=prosty ExecStart=/usr/local/bin/htg.sh Restart = w przypadku awarii RestartSec=10 KillMode=proces [Zainstalować] WantedBy=wielu użytkowników.cel
Zapisz zmiany i zamknij edytor.
Wpisy mają takie znaczenie. To są wpisy typowe. Nasza prosta usługa tak naprawdę nie potrzebuje większości z nich, ale uwzględnienie ich pozwala nam je wyjaśnić.
- Opis: To jest tekstowy opis Twojej usługi.
- Chce: Nasza usługa chce, ale nie wymaga, aby sieć była uruchomiona przed uruchomieniem naszej usługi.
- Po: Lista nazw jednostek, które powinny zostać uruchomione po pomyślnym uruchomieniu tej usługi, jeśli nie są jeszcze uruchomione.
- Typ: Prosty.
systemd
uzna tę usługę za uruchomioną, gdy tylko proces określony przezExecStart
zostanie rozwidlony. - ExecStart: ścieżka do procesu, który powinien zostać uruchomiony.
- Restart: Kiedy i czy usługa powinna zostać ponownie uruchomiona. Ustawiliśmy go na „w przypadku awarii”.
- RestartSec: czas oczekiwania przed próbą ponownego uruchomienia usługi. Ta wartość jest w sekundach.
- KillMode: Określa, w jaki sposób
systemd
powinien zabić proces, jeśli poprosimysystemctl
o zatrzymanie usługi. Mamy ten zestaw do „przetwarzania”. Powoduje to, żesystemd
używa sygnałuSIGTERM
tylko w procesie głównym. Jeśli nasza usługa byłaby nietrywialnym programem, a nie prostym skryptem, ustawilibyśmy to jako „mieszane”, aby zapewnić, że wszelkie odradzane procesy również zostaną zakończone. - WantedBy: Mamy to ustawione na „multi-user.target”, co oznacza, że usługa powinna być uruchamiana tak długo, jak system jest w stanie, w którym wielu użytkowników może się zalogować, niezależnie od tego, czy jest dostępny graficzny interfejs użytkownika.
Plik jednostki nie musi być wykonywalny, ale uprawnienia do pliku jednostki powinny ograniczać, kto może go edytować. Nie chcesz, aby złośliwy lub złośliwy użytkownik zmienił plik jednostki tak, aby wykonał zupełnie inny program.
To polecenie nada właścicielowi uprawnienia do odczytu i zapisu oraz uprawnienia do odczytu dla grupy. Inni nie będą mieli uprawnień.
sudo chmod 640 /etc/systemd/system/htg.service
Możemy poprosić systemctl
o sprawdzenie składni naszego pliku jednostki, nawet jeśli usługa nie jest jeszcze uruchomiona. Wszelkie błędy zostaną zgłoszone. (W rzeczywistości część „.service” jest opcjonalna dla większości poleceń.)
systemctl status htg.service
Żadne błędy nie są podświetlone, co oznacza, że nasz plik jednostki jest poprawny składniowo.
Uruchomienie usługi
Kiedy dodajesz nowy plik jednostek lub edytujesz już istniejący, musisz nakazać systemd
ponowne wczytanie definicji plików jednostek.
sudo systemctl demon-reload
Jeśli chcesz, aby usługa była uruchamiana przy starcie, musisz ją włączyć :
sudo systemctl włącz htg
Włączenie usługi nie uruchamia jej, ustawia ją tylko tak, aby była uruchamiana w czasie rozruchu. Aby uruchomić usługę teraz , musisz użyć systemctl
z opcją start
.
sudo systemctl start htg
Weryfikacja usługi
Po ręcznym uruchomieniu usługi lub po ponownym uruchomieniu komputera możemy zweryfikować, czy nasza usługa działa poprawnie.
sudo systemctl status htg.service
Wyświetlany jest dla nas status usługi.
- Zielona kropka oznacza, że nasza usługa działa i działa sprawnie.
- Nazwa usługi to „htg.service”, a długi opis to ten, który podaliśmy w pliku jednostki.
- Pokazano nam, który plik jednostki został załadowany „/etc/systemd/system/htg.service”.
- Usługa jest aktywna, a czas uruchomienia usługi jest dla nas podany.
- Jego PID to 7762.
- Z usługą wiążą się dwa zadania.
- Usługa wykorzystuje łącznie 928 kibibajtów pamięci.
- Grupa kontrolna obejmuje skrypt „htg.sh” i polecenie
sleep
, które zostało uruchomione przez „htg.sh”. Przez większość czasu poleceniesleep
będzie wykonywać pracę dla tej usługi.
Pokazano nam również 10 ostatnich wpisów do dziennika stworzonych przez tę usługę. Nic dziwnego, że dzieli je jedna minuta.
Zatrzymywanie i wyłączanie usługi
Jeśli chcesz zatrzymać usługę, możesz to zrobić za pomocą tego polecenia:
sudo systemctl stop htg.service
Powoduje to zatrzymanie usługi, ale nie uniemożliwia jej ponownego uruchomienia przy następnym uruchomieniu komputera. Aby zatrzymać uruchamianie usługi przy starcie, musisz ją wyłączyć :
sudo systemctl wyłącz htg.service
Jeśli usługa jest uruchomiona, to polecenie jej nie zatrzymuje. Po prostu mówi systemd
, aby nie uruchamiał usługi przy następnym ponownym uruchomieniu.
Jeśli chcesz zatrzymać usługę i uniemożliwić jej uruchamianie podczas uruchamiania, użyj obu poleceń.
Porada serwisowa
Upewnij się, że program działa zgodnie z oczekiwaniami, zanim spróbujesz go uruchomić jako usługę.
Polecenia Linuksa | ||
Pliki | tar · pv · kot · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · dysk testowy · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · ogon · stat · ls · fstab · echo · mniej · chgrp · chown · rev · wygląd · stringi · typ · zmiana nazwy · zip · rozpakuj · montuj · umount · zainstaluj · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · konwertuj · rclone · shred · srm | |
Procesy | alias · ekran · top · ładne · renice · postęp · strace · systemd · tmux · chsh · historia · w · wsad · free · co · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · ściana · tak · kill · sen · sudo · su · czas · groupadd · usermod · grupy · lshw · zamknij · restart · halt · poweroff · passwd · lscpu · crontab · data · bg · fg | |
Sieć | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
POWIĄZANE: Najlepsze laptopy z systemem Linux dla programistów i entuzjastów