โดยทั่วไปเป็นความคิดที่ดีที่จะลองใช้วิธีที่ง่าย ๆ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
กระบวนการ)