Saya menjalankan skrip di bawah ini:
#!/bin/bash
ps ax | grep -q [v]arnish
if [ $? -eq 0 ];then
echo varnish is running...
exit 0
else
echo "Critical : varnish is not running "
exit 2
fi
Outputnya seperti ::
[root@server ~]# sh -x check_varnish_pro.sh
+ ps ax
+ grep -q '[v]arnish'
+ '[' 0 -eq 0 ']'
+ echo varnish is running...
varnish is running...
+ exit 0
Ketika saya menjalankan yang sama di baris perintah saya mendapatkan status keluar sebagai 1:
[root@server ~]# ps ax | grep -q [v]arnish; echo $?
1
Kasing seperti pernis tidak diinstal di server. Skrip ini berfungsi dengan baik di server tempat pernis diinstal.
Mengapa status keluar berbeda ketika dijalankan menggunakan skrip dan baris perintah? Bagaimana cara memperbaiki skrip ini?
shell-script
process
ps
exit-status
prado
sumber
sumber
Jawaban:
Saat Anda menjalankan skrip bernama
check_varnish_pro.sh
tesberhasil karena ada skrip bernama
check_
pernis_pro
berjalan.sumber
Secara umum, itu adalah ide yang buruk untuk mencoba pendekatan sederhana dengan
ps
dangrep
untuk mencoba menentukan apakah suatu proses berjalan.Anda akan jauh lebih baik menggunakan
pgrep
ini:Lihat manual untuk
pgrep
. Pada beberapa sistem (mungkin bukan pada Linux), Anda mendapatkan-q
bendera yang sesuai dengan bendera yang samagrep
yang menghilangkan kebutuhan untuk mengarahkan ulang/dev/null
. Ada juga-f
bendera yang melakukan pertandingan pada baris perintah penuh dan bukan hanya pada nama proses. Satu juga dapat membatasi kecocokan dengan proses milik pengguna tertentu menggunakan-u
.Menginstal
pgrep
juga memberi Anda aksespkill
yang memungkinkan Anda memberi sinyal proses berdasarkan namanya.Juga, jika ini adalah daemon layanan , dan jika sistem Unix Anda memiliki cara untuk menanyakan informasi (misalnya, apakah sudah aktif dan berjalan atau tidak), maka itu adalah cara yang tepat untuk memeriksanya.
Di Linux, Anda memiliki
systemctl
(systemctl is-active --quiet varnish
akan mengembalikan 0 jika berjalan, 3 sebaliknya), pada OpenBSD yang Anda milikircctl
, dll.Sekarang ke skrip Anda:
Dalam skrip Anda, Anda mem-parsing keluaran dari
ps ax
. Output ini akan berisi nama skrip itu sendiricheck_varnish_pro.sh
, yang jelas berisi stringvarnish
. Ini memberi Anda positif palsu. Anda akan melihat ini jika Anda menjalankannya tanpa-q
flag untukgrep
saat pengujian.Menjalankannya:
Masalah lain adalah bahwa meskipun Anda mencoba untuk "menyembunyikan"
grep
proses agar tidak terdeteksigrep
sendiri dengan menggunakan[v]
dalam pola. Pendekatan itu akan gagal jika Anda menjalankan skrip atau baris perintah di direktori yang memiliki file atau direktorivarnish
di dalamnya (dalam hal ini Anda akan mendapatkan false positive, lagi). Ini karena polanya tidak dikutip dan shell akan melakukan penggumpalan nama file dengannya.Lihat:
Kehadiran file
varnish
akan menyebabkan shell untuk mengganti[v]arnish
dengan nama filevarnish
dan Anda mendapatkan hit pada pola di tabel proses (grep
proses).sumber
check_varnish_pro.sh
juga merupakan faktor.@AlexP menjelaskan dengan sangat ringkas apa yang sebenarnya terjadi, tetapi gagasan @ Kusalananda tentang menggunakan
pgrep
/pkill
untuk proses kritis sangat tidak disarankan . Solusi yang lebih baik meliputi:systemctl status varnishd
harus mengatasinya pada instalasi * nix modern.Jika karena keadaan yang tidak menguntungkan Anda tidak memiliki layanan yang tersedia, Anda dapat mengubah skrip startup untuk melaporkan masalah segera setelah proses keluar:
kill -0 "$pid"
.sumber
systemctl
hampir hanya tersedia di Linux (AFAIK), dan tidak pada semua sistem mirip Unix modern.