วันพฤหัสบดีที่ 19 มีนาคม พ.ศ. 2563

check program running, crontab shell script

หากเราต้องการตรวจสอบว่า โปรแกรมที่เราเขียนนั้น ยังทำงานอยู่หรือไม่ ให้ทำดังนี้

วิธีที่1 Terminal

เปิด terminal แล้วพิมพ์
pgrep ตามด้วยชื่อโปรแกรม เช่น pgrep TagAgent
ก็จะได้เลข PID ออกมา ซึ่งเป็นเลข process ของโปรแกรม


วิธีที่2 Shell script (ไม่แนะนำ เนื่องจากพลาดได้บางครั้ง)

ในการเขียน shell script การใช้เครื่องหมายต่างๆ, การเว้นวรรค มีผลต่อการเขียนโปรแกรม
จำเป็นต้องศึกษาการใช้งานสักเล็น้อย ก่อนใช้งาน

สร้างไฟล์ขึ้นมาโดยพิมพ์ nano check_process.sh

#!/bin/bash
sudo rm /tmp/TagAgent.pid
pidof TagAgent >> /tmp/TagAgent.pid
while IFS= read -r line; do
    echo "Text read from file: $line"
done < /tmp/TagAgent.pid

Shell script ตรวจสอบโปรแกรม

ถ้าเราต้องการตรวจสอบว่าโปรแกรมรันอยู่หรือไม่ แล้วถ้าไม่รัน ก็สั่งให้เปิดโปรแกรม ให้ทำดังนี้

nano monitor-process.sh

#!/bin/bash
sudo rm /tmp/TagAgent.pid
sudo pidof TagAgent >> /tmp/TagAgent.pid
declare -i x=0
while IFS= read -r line; do
    if [ $line != "" ]
    then
        echo "Text: $line"
        x=$((x+1))
    else
        echo "No text"
    fi
done < /tmp/TagAgent.pid

if [ $x == 0 ]
then
  cd /home/pi/TagAgent
  sudo ./TagAgent &
else
  echo "run"
fi



เมื่อเราสร้างไฟล์ Script แล้ว ต้องทำให้ไฟล์นี้รันได้
sudo chmod +x monitor-process.sh

และก็ต้องตั้งเวลาให้ไฟล์ตัวนี้รันทุกๆ 1 นาที
เราสามารถทำได้โดยใช้ Crontab ดังนี้

พิมพ์ crontab -e
บรรทัดล่างสุด ให้เพิ่ม
* * * * * /home/pi/monitor-process.sh
กด control + o, control+x
sudo /etc/init.d/cron restart


ในรูปนี้พลาดไปอย่างนึง คือมันจะ reboot ทุกๆนาทีตอนตี 2 หมายความว่า 2.00 น., 2.01 น., 2.02 น. ... จะ reboot ตลอดทุกนาที จนกว่าจะถึงเวลาตี 3
ดังนั้นถ้าจะแก้ให้ถูกต้อง คือ reboot แค่ครั้งเดียวตอนตี 2 จะต้องแก้เป็น
0 2 * * * sudo reboot

และจากการทดสอบใช้จริง การใช้ pidof จาก shell script (วิธีที่2) มันจะมีการเช็คพลาดบางครั้ง
ดังนั้น จึงไม่แนะนำให้ใช้ วิธีการนี้ครับ

จบ

ที่มา
https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable
https://linuxize.com/post/how-to-remove-files-and-directories-using-linux-command-line/
https://bash.cyberciti.biz/guide/Create_an_integer_variable
https://askubuntu.com/questions/682913/how-to-write-shell-script-to-start-some-programs