Secara umum, itu adalah ide yang buruk untuk mencoba pendekatan sederhana dengan ps
dan grep
untuk mencoba menentukan apakah suatu proses berjalan.
Anda akan jauh lebih baik menggunakan pgrep
ini:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Lihat manual untuk pgrep
. Pada beberapa sistem (mungkin bukan pada Linux), Anda mendapatkan -q
bendera yang sesuai dengan bendera yang sama grep
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 akses pkill
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 miliki rcctl
, dll.
Sekarang ke skrip Anda:
Dalam skrip Anda, Anda mem-parsing keluaran dari ps ax
. Output ini akan berisi nama skrip itu sendiri check_varnish_pro.sh
, yang jelas berisi string varnish
. Ini memberi Anda positif palsu. Anda akan melihat ini jika Anda menjalankannya tanpa -q
flag untuk grep
saat pengujian.
#!/bin/bash
ps ax | grep '[v]arnish'
Menjalankannya:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Masalah lain adalah bahwa meskipun Anda mencoba untuk "menyembunyikan" grep
proses agar tidak terdeteksi grep
sendiri dengan menggunakan [v]
dalam pola. Pendekatan itu akan gagal jika Anda menjalankan skrip atau baris perintah di direktori yang memiliki file atau direktori varnish
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:
bash-4.4$ set -x
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep '[v]arnish'
bash-4.4$ touch varnish
+ touch varnish
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep varnish
91829 p2 SN+p 0:00.02 grep varnish
Kehadiran file varnish
akan menyebabkan shell untuk mengganti [v]arnish
dengan nama file varnish
dan Anda mendapatkan hit pada pola di tabel proses ( grep
proses).