Właśnie zaktualizowałem CentOS 6.5 do 7.0 i nie jestem zbyt szczęśliwy, ponieważ nowy systemd
prawdopodobnie przysparza mi problemów. Wygląda na to, że po prostu uruchamia się zbyt szybko, asynchronicznie uruchamia procesy i psuje zależności serwisowe.
Na przykład mam kilka skryptów, w crond
których uruchamiane są po restarcie:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Powoduje to wszelkiego rodzaju dziwne błędy (pokazujące tylko jeden z nich):
Warning: stream_socket_client(): unable to connect to tcp://192.168.20.4:4001
(Network is unreachable) in /root/scripts/check_gmail.php on line 137
ERROR: Network is unreachable (101)
W powyższym piszę do gniazda TCP. Jest dla mnie całkiem jasne, że crond
jest uruchamiany zanim sieć zostanie poprawnie zainicjowana jako network is unreachable
.
To samo dotyczy Apache i MySQL (MariaDB). MySQL uruchamia się dość wolno (dużo danych), co oznacza, że zarówno Apache, jak i wiele moich crond
skryptów startowych zawodzi, ponieważ baza danych MySQL nie działa podczas wywoływania skryptów.
Próbowałem skonfigurować zależności, ale bez powodzenia; Dołączyłem network
i mysql
usługi [Unit]
(jak widać z systemctl list-dependencies
). Idealnie wszystkie usługi czekają na uruchomienie MySQL:
vi /lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target network.service mysql.service
vi /lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=syslog.target auditd.service systemd-user-sessions.service time-sync.target network.service mysql.service
Podczas uruchamiania przy użyciu powyższego otrzymuję te same błędy. Dostaję również e-maile, mailq
ponieważ sieć / DNS nie jest gotowa podczas przetwarzania skryptów cron. Kilka minut po uruchomieniu są wysyłane poprawnie.
Czy ktoś może pomóc w uzyskaniu tego, upewniając się, że usługi są uruchamiane we właściwej kolejności? Wydaje się bardzo błędne, że tak szybko się uruchamia i idealnie zrobił to po staremu, „uruchamiając jedną usługę ... czekaj ... uruchamiając nową usługę ... czekaj ... itd.).
Zauważ, że nie jestem pewien, czy to jest systemd
mój problem - to tylko moja teoria tego, co mogę czytać z sieci.
grep -i concurrency /etc/default/rcS
? Być może mieszam swoje systemy inicjujące, ale wydaje mi się, że pamiętam, że kontroluje to, czy procesy będą czekać na zakończenie innych./etc/default/rc*
Requires=network.target
do powyższych jednostek.Requires=network.target
do/lib/systemd/system/crond.service
Odpowiedzi:
Po dużo więcej lekturach znalazłem rozwiązanie, które działa dla mnie.
Przeczytałem ten przewodnik: Uruchamianie usług po uruchomieniu sieci . Mały cytat z przewodnika:
Właśnie tego chciałem, więc włączyłem tę usługę i ustawiłem regułę zależności w pliku usługi dla
crond
:Ponieważ
mysqld
nadal opiera się na starym,init.d
który potrzebowałem do stworzeniasystemd
usługi, jak tu sugerowano, włączenie systemctl różni się od uruchomienia systemctl :I na koniec skonfiguruj usługę Apache do uruchamiania po MySQL:
To przynajmniej działa dla mnie.
Użyłem tych poleceń, aby sprawdzić to później, gdzie wyraźnie widzę, że sieć jest uruchamiana przed przynajmniej MySQL i Apache. Chociaż
crond
nigdzie nie widzę, ale widzę, że działa w moich skryptach:Kilka innych przydatnych poleceń, których użyłem, to:
Jeśli ktoś widzi lepszy sposób, aby to zrobić, prosimy o udostępnienie.
źródło
systemd-analyze critical-chain
. Nie tylko zamierzam tak często używać, ale nagle jestem sprzedawanysystemd
. Dzięki!