Mój problem:
Piszę skrypt bash, w którym chciałbym sprawdzić, czy dana usługa jest uruchomiona.
Wiem, jak to zrobić ręcznie, za pomocą $ service [service_name] status
.
Ale (zwłaszcza od przejścia na systemd) drukuje całą wiązkę tekstu, który jest nieco niechlujny do przeanalizowania. Zakładałem, że istnieje polecenie dla skryptów z prostym wyjściem lub zwracana wartość, którą mogę sprawdzić.
Ale Googling przynosi tylko mnóstwo wyników „Och, tylko ps aux | grep -v grep | grep [service_name]
”. To nie może być najlepsza praktyka, prawda? Co się stanie, jeśli uruchomiona zostanie inna instancja tej komendy, ale nie uruchomiona przez skrypt inicjujący SysV?
A może powinienem się zamknąć i zabrudzić ręce odrobiną pgrep?
źródło
inactive
lubactivating
obasystemctl status
isystemctl is-active
wychodzą z 3. (od systemd-241 ) Obejście:systemctl show service | grep -qx ActiveStatus=activating
foo
robi coś w systemie obejmującym ponowne uruchomienie i używa jednorazowej usługi, powiedzmy,foo_cleanup
przy następnym uruchomieniu do czyszczenia. Jestem testowania to (mój skrypt jest również zaplanowane jako usługa) i chcesz odebrać błędy później, ale kiedy jest później (muzyka Vsauce)? Cóż, jednym z kryteriów jest to, żefoo_cleanup
się skończyło („przestał być aktywny”).systemctl
ma tryb odpowiedni dla skryptów; użyjshow
zamiaststatus
, i dodaj opcje-p
/--properties
i,--value
aby uzyskać tylko pożądany wynik.Oto przykład (z systemu Ubuntu 17.04):
Uruchamianie (lub w inny sposób) to
SubState
. Jeśli chcesz wiedzieć, czy usługa jest aktywna, skorzystaj z właściwościActiveState
Uwagi z
man
:źródło
--version
opcję z systemctl.Jako uzupełnienie odpowiedzi Zanny wprowadzono
--value
opcję dla wersji 230 systemd . Więc może nie być dostępny w niektórych dystrybucjach, takich jak debian jessie.systemctl show
W takim przypadku można emulować opcję za pomocą sed:
źródło
Uważam to za przydatne do wykonywania wiersza poleceń lub jeśli tworzysz skrypty.
Skopiowano z @StephenKitt
Spowoduje to sprawdzenie, czy usługa jest wyłączona i ponowne uruchomienie usługi
||
nie sprawdza, czy wartość zwracana z systemctl jest niezerowe sens, jeśli nie jest aktywny, jak wyjaśniono przez autora.źródło
Jestem zbyt późno do partii, jednak stosując systemctl jest czynne wraz z
&&
i||
do tego w skrypcie przyzwyczajenie być tak cały czas. Poniżej jest jeden, którego użyłem dla tomcat, ale mogę go użyć w metodzie przyjmującej argumenty i przekazując nazwę usługi jako argumenty, jeśli musisz sprawdzić wiele usług, ale jest to poza zakresem tutaj.W ten sposób wykorzystałem .... Po prostu udostępniając moje.
a dla uproszczenia i łatwych rzeczy postępuj zgodnie z innymi wyjaśnionymi tutaj:
źródło
if systemctl is-active --quiet tomcat.service
? Ponadto[[
nie jest standardową powłoką.&&
i||
.Zamiast używać polecenia sed, jak w odpowiedzi Oxmela, wystarczy użyć
cut -d'=' -f 2
dla wszystkich zapytanych właściwości:na przykład:
źródło
Właśnie znalazłem ten świetny mały skrypt:
Źródło
źródło