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?
Odpowiedzi:
Oprócz tego, co znaleźli TokyoMEWS ...
(co nie jest całkowicie poprawne -
Type=forking
staje się konieczne tylko wtedy, gdy skrypt kończy działanie podczas działania jego dzieci )... inne możliwe problemy to:
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).
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]
).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.źródło
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 .
źródło