Secara umum, itu adalah ide yang buruk untuk mencoba pendekatan sederhana dengan psdan grepuntuk mencoba menentukan apakah suatu proses berjalan.
Anda akan jauh lebih baik menggunakan pgrepini:
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 -qbendera yang sesuai dengan bendera yang sama grepyang menghilangkan kebutuhan untuk mengarahkan ulang /dev/null. Ada juga -fbendera 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 pgrepjuga memberi Anda akses pkillyang 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 varnishakan 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 -qflag untuk grepsaat 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" grepproses agar tidak terdeteksi grepsendiri dengan menggunakan [v]dalam pola. Pendekatan itu akan gagal jika Anda menjalankan skrip atau baris perintah di direktori yang memiliki file atau direktori varnishdi 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 varnishakan menyebabkan shell untuk mengganti [v]arnishdengan nama file varnishdan Anda mendapatkan hit pada pola di tabel proses ( grepproses).