ฉันรู้ว่าฉันต้องนับจำนวนอินสแตนซ์ที่กำลังทำงาน:
ps x | grep apache2 | wc -l
ผลถ้ามันทำงาน: 2
, หรืออื่น ๆ: 1
ฉันก็รู้ว่ามีคำสั่งที่เรียกว่า test
ที่ฉันสามารถใช้เพื่อทำการตรวจสอบ แต่ฉันไม่รู้วิธีใช้ test
กับ wc
ฉันรู้ว่าฉันต้องนับจำนวนอินสแตนซ์ที่กำลังทำงาน:
ps x | grep apache2 | wc -l
ผลถ้ามันทำงาน: 2
, หรืออื่น ๆ: 1
ฉันก็รู้ว่ามีคำสั่งที่เรียกว่า test
ที่ฉันสามารถใช้เพื่อทำการตรวจสอบ แต่ฉันไม่รู้วิธีใช้ test
กับ wc
คำตอบ:
สคริปต์เริ่มต้นในการกระจาย Linux ส่วนใหญ่จัดการสิ่งนี้โดยการบันทึก ID กระบวนการ ของบริการ (daemon) เมื่อพวกเขาเปิดมัน
โดยทั่วไปแล้ว PID เหล่านี้จะถูกเก็บไว้ใน /var/run/
. ตัวอย่างเช่นในระบบของฉัน Apache2 เก็บไว้เป็น ID กระบวนการดั้งเดิมหรือผู้ปกครอง (มีประโยชน์สำหรับกระบวนการก่อนแยก) ใน /var/run/apache2.pid
. ดังนั้นคุณสามารถส่งสัญญาณเช่น SIGHUP
หรือ SIGSTOP
ไปยังกระบวนการเพื่อส่งสัญญาณการกำหนดค่าโหลดใหม่หรือหยุดบริการ (daemon)
หมายเหตุหนึ่งที่จะช่วยคุณได้ ps ax
การค้นหากระบวนการสไตล์คือการใช้เคล็ดลับเล็ก ๆ น้อย ๆ เพื่อหลีกเลี่ยงรูปแบบการแสดงออกปกติของ grep ที่ใช้สำหรับการจับคู่ เช่น. ps ax | grep [a]pache2 | wc -l
man test
ช่วยให้คุณมีพื้นฐานของ test
คำสั่ง สำหรับงานง่าย ๆ ในเชลล์สคริปต์ควรหลีกเลี่ยงการพึ่งพาเชลล์ที่คุณใช้ ปกติสำหรับ การเขียนสคริปต์ขั้นพื้นฐาน การเขียนสคริปต์ที่กำหนดเป้าหมาย Bourne Shell ( /bin/sh
) ขอแนะนำเนื่องจากสิ่งนี้มีแนวโน้มที่จะเป็นตัวหารร่วมที่ได้รับความนิยมสูงสุด
#!/bin/sh
RC= `ps ax | grep [a]pache2 | wc -l`
if [ $RC -gt 0 ]; then
kill -SIGSTOP `cat /var/run/apache2.pid`
fi
grep [a]pache2
! ขอบคุณสำหรับสิ่งนั้น
หากคุณกำลังทำงานกับทุบตีคุณสามารถทำได้ด้วยเงื่อนไข การตรวจสอบ :
#/bin/bash num="1" if [ $num -eq "1" ]; then echo "got 1" fi if [ $num -eq "2" ]; then echo "got 2" fi
num
เท่ากับ ps x | grep apache2 | wc -l
?
if (( $(ps x | grep [a]pache2 | wc -l) > 0 ))
then
do_something
else
do_something_else
fi
หรือ
case $(ps x | grep [a]pache2 | wc -l) in
0)
do_zero_thing
;;
1)
do_one_thing
;;
*)
do_default_thing
;;
esac
วงเล็บเหลี่ยมที่ใช้ในวิธีนั้นใน grep
คำสั่งไม่ใส่คำสั่ง grep
ตัวเองจากการรวมอยู่ในเอาท์พุทของตัวเอง สิ่งนี้จะทำให้กระบวนการนับเป็น 0 หาก apache ไม่ทำงาน