Genel olarak, basit bir yaklaşım denemek için kötü bir fikir psve grepbelirli bir süreç çalışıp çalışmadığını belirlemek için denemek için.
Bunun pgrepiçin kullanmak çok daha iyi olurdu :
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
İçin kılavuza bakınız pgrep. Bazı sistemlerde (muhtemelen Linux'ta değil), yönlendirme gereksiniminden kurtulan -qaynı bayrağa karşılık gelen bir bayrak alırsınız . Ayrıca , işlemi yalnızca işlem adından ziyade tam komut satırında gerçekleştiren bir bayrak vardır. Ayrıca eşleşme, belirli bir kullanıcıya ait işlemlerle sınırlandırılabilir .grep/dev/null-f-u
Kurulum pgrepayrıca pkill, adlarına göre süreçleri işaretlemenize izin veren erişim sağlar.
Ayrıca, bu bir hizmet arka plan programı ise ve Unix sisteminizde bunu bilgi için sorgulamanın bir yolu varsa (örneğin, çalışıp çalışmadığını), o zaman bu kontrol etmenin uygun yoludur.
Linux'ta, sahip systemctl( systemctl is-active --quiet varnishÇalışıyorsa 3 aksi takdirde 0 döndürür), sahip OpenBSD'deki rcctlvs.
Şimdi senaryonuza:
Senaryonuzda çıktıyı ayrıştırırsınız ps ax. Bu çıktı, check_varnish_pro.shaçıkça dizeyi içeren betiğin adını içerecektir varnish. Bu size yanlış bir pozitif verir. Test sırasında -qbayrağı olmadan çalıştırsaydınız bunu fark ederdiniz grep.
#!/bin/bash
ps ax | grep '[v]arnish'
Koşu:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Başka bir sorun, desende kullanarak grepişlemin grepkendi başına algılanmasını "gizlemeye" çalışmanızdır [v]. Komut dosyasını veya komut satırını, içinde bir dosya veya dizin bulunan bir dizinde çalıştırırsanız bu yaklaşım başarısız olur varnish(bu durumda yine yanlış pozitif alırsınız). Bunun nedeni, desenin tırnaksız olması ve kabuğun onunla dosya adı globbing yapmasıdır.
Görmek:
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
Dosyanın varlığı varnishkabuğun [v]arnishdosya adıyla değiştirilmesine neden olur varnishve işlem tablosundaki ( grepişlem) desende bir isabet alırsınız .