Masalahku:
Saya sedang menulis skrip bash dan di dalamnya saya ingin memeriksa apakah layanan yang diberikan berjalan.
Saya tahu cara melakukannya secara manual, dengan $ service [service_name] status
.
Tapi (terutama sejak pindah ke systemd) yang mencetak sejumlah teks yang agak berantakan untuk diurai. Saya berasumsi ada perintah yang dibuat untuk skrip dengan output sederhana atau nilai pengembalian yang bisa saya periksa.
Tetapi Googling hanya menghasilkan satu ton hasil "Oh, hanya ps aux | grep -v grep | grep [service_name]
". Itu bukan praktik terbaik, bukan? Bagaimana jika instance lain dari perintah itu sedang berjalan, tetapi tidak ada yang memulai dengan skrip init SysV?
Atau haruskah saya tutup mulut dan tangan saya kotor dengan pgrep kecil?
sumber
inactive
atauactivating
dan keduanyasystemctl status
dansystemctl is-active
keluar dengan 3. (pada systemd-241 ) Penanganan masalah:systemctl show service | grep -qx ActiveStatus=activating
foo
melakukan sesuatu pada sistem yang melibatkan reboot dan menggunakan layanan sekali pakai, katakanlah,foo_cleanup
pada boot berikutnya untuk membersihkan segalanya. Aku pengujian ini (script saya juga dijadwalkan sebagai layanan) dan ingin mengumpulkan kesalahan setelah itu, tetapi ketika adalah setelah (Vsauce musik)? Nah salah satu kriterianya adalah yangfoo_cleanup
sudah selesai ("berhenti aktif").systemctl
memang memiliki mode yang cocok untuk skrip; gunakanshow
daripadastatus
, dan tambahkan opsi-p
/--properties
dan--value
untuk mendapatkan hanya output yang Anda inginkan.Berikut ini sebuah contoh (dari sistem Ubuntu 17.04):
Menjalankan (atau sebaliknya) adalah a
SubState
. Jika Anda ingin tahu apakah suatu layanan aktif, gunakan properti tersebutActiveState
Catatan dari
man
:sumber
--version
opsi dengan systemctl.Sebagai pelengkap jawaban Zanna,
--value
opsi untuksystemctl show
telah diperkenalkan dengan versi 230 dari systemd . Jadi mungkin tidak tersedia di distro tertentu seperti debian jessie.Dalam hal ini, seseorang dapat meniru opsi dengan menggunakan sed:
sumber
saya menemukan ini berguna untuk eksekusi baris perintah atau jika Anda membuat skrip.
Disalin dari @StephenKitt
Ini akan memeriksa apakah layanan tidak aktif dan melakukan restart layanan
di
||
sana memeriksa apakah nilai kembali dari systemctl adalah non-nol yang berarti jika tidak aktif seperti yang dijelaskan oleh penulis.sumber
Saya terlambat ke pesta, namun menggunakan systemctl aktif bersama
&&
dan||
untuk ini dalam skrip tidak akan terjadi sepanjang waktu. Di bawah ini adalah yang saya gunakan untuk kucing jantan tetapi dapat menggunakannya dalam metode mengambil argumen dan memberikan nama layanan sebagai argumen jika Anda harus memeriksa beberapa layanan tetapi di luar ruang lingkup di sini.Ini adalah bagaimana saya memanfaatkan .... Hanya berbagi milik saya.
dan untuk kesederhanaan dan kemudahan, ikuti yang lain yang dijelaskan di sini:
sumber
if systemctl is-active --quiet tomcat.service
? Juga,[[
bukan shell standar.&&
dan||
.Alih-alih menggunakan perintah sed seperti dalam jawaban Oxmel, itu cukup untuk digunakan
cut -d'=' -f 2
untuk semua jenis properti yang ditanyakan:sebagai contoh:
sumber
Baru saja menemukan skrip kecil yang hebat ini:
Sumber
sumber