Systemd nie może uruchomić skryptu?

9

Mam skrypt BASH, który chcę uruchomić przy uruchamianiu. Mój system działa systemd, więc utworzyłem plik .service z tym, co moim zdaniem jest niezbędną informacją:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

Użyłem systemctl enable, aby „zarejestrować” go ponownie. Podczas rozruchu powiedziano mi, że mój skrypt zostanie wykonany, ale nie widziałem żadnych komunikatów ECHO, które powinny być wyświetlane na ekranie, ani nie zapisywał czegoś do pliku, zgodnie z tym, co napisałem w skrypcie. Dodatkowo nie uruchamia aplikacji, którą ma uruchomić.

Status Systemctl mówi mi, że skrypt został uruchomiony i zakończył się pomyślnie. Mimo to skrypt nie działa. Jeśli uruchomię skrypt z powłoki, działa on doskonale.

Czy ktoś z was wie, jaki może być mój problem?

TokyoMEWS
źródło
3
Najwyraźniej, jeśli skrypt zaczyna coś innego, potrzebuje „Type = forking”. Czuję się trochę głupio, że nie zadzierałem z ustawieniami wcześniej.
TokyoMEWS,
1
+1 za jego rozwiązanie. Prześlij swoje rozwiązanie jako odpowiedź i zaakceptuj je, aby pomóc innym osobom z tym samym problemem.
terdon
1
@TokyoMEWS: Mówiąc dokładniej, jeśli skrypt uruchamia coś innego i kończy działanie podczas działania jego dzieci, potrzebuje „Type = forking”.
user1686

Odpowiedzi:

7

Oprócz tego, co znaleźli TokyoMEWS ...

Najwyraźniej, jeśli skrypt zaczyna coś innego, potrzebuje „Type = forking”

(co nie jest całkowicie poprawne - Type=forkingstaje się konieczne tylko wtedy, gdy skrypt kończy działanie podczas działania jego dzieci )

... inne możliwe problemy to:

  1. Zgaduję, że przez „display on screen” miałeś na myśli, że skrypt po prostu zapisuje coś na standardowe wyjście. To nie przechodzi do ekranu podczas uruchamiania - raczej wszystko od standardowego interfejsu usługi jest wysyłane do dziennika (lub do syslog, w zależności od wersji systemowej).

  2. Jeśli nie faktycznie próba zapisu na ekranie (np używając echo Hi >/dev/tty1), to jest bardzo prawdopodobne, że wyjście skryptu znika kiedy agetty czyści ekran przed pokazaniem monity logowania. (Aby tego uniknąć, musisz zamówić urządzenie [email protected]).

  3. Aby zapisać coś do pliku, musisz mieć zainstalowany system plików do odczytu i zapisu. W tym celu After=local-fs.target może być konieczne, w przeciwnym razie urządzenie może zostać ponownie uruchomione zbyt wcześnie. Zależy to jednak od konkretnej konfiguracji systemu operacyjnego.

użytkownik1686
źródło
1

Jeśli twój skrypt również definiuje klauzulę ExecStop , musisz ustawić „ RemainAfterExit = yes”, aby uniknąć wywoływania ExecStop automatycznie po ExecStart . Dzięki temu twoja usługa będzie w stanie „ aktywna ” po wykonaniu polecenia ExecStart .

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
ibai
źródło