โดยทั่วไปเป็นความคิดที่ดีที่จะลองใช้วิธีที่ง่าย ๆpsและgrepลองพิจารณาว่ากระบวนการที่กำหนดกำลังทำงานอยู่หรือไม่
คุณจะดีกว่ามากในการใช้pgrepสิ่งนี้:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
pgrepดูคู่มือสำหรับ ในบางระบบ (อาจจะไม่ได้อยู่ในลินุกซ์) คุณจะได้รับ-qธงที่สอดคล้องกับธงเดียวกันสำหรับการที่ได้รับกำจัดของจำเป็นที่จะต้องเปลี่ยนเส้นทางไปยังgrep /dev/nullนอกจากนี้ยังมีการ-fตั้งค่าสถานะที่ดำเนินการจับคู่บนบรรทัดคำสั่งแบบเต็มแทนที่จะเป็นเพียงชื่อกระบวนการ หนึ่งยังอาจ จำกัด -uการแข่งขันกับกระบวนการที่อยู่ของผู้ใช้เฉพาะที่ใช้
การติดตั้งpgrepยังช่วยให้คุณเข้าถึงpkillซึ่งอนุญาตให้คุณส่งสัญญาณกระบวนการตามชื่อของพวกเขา
นอกจากนี้หากเป็นภูตบริการและถ้าระบบยูนิกซ์ของคุณมีวิธีการสอบถามเพื่อขอข้อมูลการ (เช่นไม่ว่าจะเป็นขึ้นและทำงานได้หรือไม่) แล้วว่าเป็นที่เหมาะสมด้วยวิธีการตรวจสอบเกี่ยวกับมัน
บน Linux คุณมีsystemctl( systemctl is-active --quiet varnishจะคืนค่า 0 ถ้ามันทำงานอยู่ 3 อย่าง) บน OpenBSD ที่คุณมีrcctlเป็นต้น
ตอนนี้ถึงสคริปต์ของคุณ:
ps axในสคริปต์ของคุณคุณแยกขาออกจาก ผลลัพธ์นี้จะมีชื่อของสคริปต์เองซึ่งเห็นได้ชัดว่ามีสตริงcheck_varnish_pro.sh varnishสิ่งนี้จะทำให้คุณคิดบวก คุณจะเห็นสิ่งนี้ถ้าคุณเรียกใช้โดยไม่มีการ-qตั้งค่าสถานะสำหรับgrepในขณะทดสอบ
#!/bin/bash
ps ax | grep '[v]arnish'
ใช้มัน
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
ปัญหาอื่นคือแม้ว่าคุณพยายาม "ซ่อน" grepกระบวนการจากการตรวจพบด้วยgrepตัวเองโดยใช้[v]ในรูปแบบ วิธีการนั้นจะล้มเหลวหากคุณเรียกใช้สคริปต์หรือบรรทัดคำสั่งในไดเรกทอรีที่มีชื่อไฟล์หรือไดเรกทอรีvarnishอยู่ (ในกรณีนี้คุณจะได้รับผลบวกปลอมอีกครั้ง) นี่เป็นเพราะรูปแบบไม่ได้ถูกยกมาแล้วและเชลล์จะแสดงชื่อไฟล์ให้กลมกลืนไปกับมัน
ดู:
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
การปรากฏตัวของไฟล์varnishจะทำให้เปลือกแทนที่[v]arnishด้วยชื่อไฟล์varnishและคุณจะได้รับผลกระทบในรูปแบบในตารางกระบวนการ ( grepกระบวนการ)