Bash script kiểm tra và thông báo PHP, Mysql, Nginx tới Telegram

Trong lúc search các thông tin về các dịch vụ monitor, tình cờ thấy bài viết Kiểm tra và thông báo Service bị Stop qua Telegram, cá nhân thấy khá hay, nên vác về để chạy cho thèng bibica.net

Cụ thể thèng bibica.net đang chạy trên Webinoly, sử dụng Nginx, PHP 7.4 và Mariadb

Kiểm tra các phiên bản cụ thể đang chạy bằng lệnh service --status-all

service --status-all
 [ + ]  apparmor
 [ + ]  apport
 [ - ]  console-setup.sh
 [ + ]  cron
 [ - ]  cryptdisks
 [ - ]  cryptdisks-early
 [ + ]  dbus
 [ - ]  grub-common
 [ - ]  hwclock.sh
 [ + ]  irqbalance
 [ + ]  iscsid
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ - ]  lvm2
 [ - ]  lvm2-lvmpolld
 [ + ]  mariadb
 [ + ]  multipath-tools
 [ + ]  netfilter-persistent
 [ - ]  nfs-common
 [ + ]  nginx
 [ - ]  nginx-debug
 [ - ]  open-iscsi
 [ - ]  open-vm-tools
 [ + ]  php7.4-fpm
 [ + ]  plymouth
 [ + ]  plymouth-log
 [ + ]  procps
 [ + ]  rpcbind
 [ - ]  rsync
 [ - ]  screen-cleanup
 [ + ]  ssh
 [ + ]  udev
 [ + ]  ufw
 [ + ]  unattended-upgrades
 [ - ]  uuidd
 [ - ]  x11-common

1. Monitor Status PHP, Mysql, Nginx

Đầu tiên là tạo 1 con chat bot Telegram, ví dụ

  • Bot Token 6360723418:AAF1aya50fEi6sVuOwhXp53Ic19siP3gqLc
  • Chat ID 489842537″

Sau đó tạo 1 file bash bên trong /usr/local/bin/, có thể đặt tên là monitor_service.sh

touch /usr/local/bin/monitor_service.sh
nano /usr/local/bin/monitor_service.sh

Nội dung bên trong điền vào

#!/bin/bash
while true
do

# Set up Telegram bot API and chat ID
BOT_API_KEY="6360723418:AAF1aya50fEi6sVuOwhXp53Ic19siP3gqLc"
CHAT_ID="489842537"

# Check if MySQL service is running  
if ! systemctl is-active --quiet mysql.service; then
  # If not running, send message to Telegram
  MESSAGE="MySQL service is down!"
  curl -s -X POST https://api.telegram.org/bot$BOT_API_KEY/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
fi

# Check if Nginx web server is running  (Thay bằng dịch vụ webserver trên VPS của bạn)
if ! systemctl is-active --quiet nginx.service; then
  # If not running, send message to Telegram
  MESSAGE="Nginx web server is down!"
  curl -s -X POST https://api.telegram.org/bot$BOT_API_KEY/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
fi

# Check if PHP service is running (Thay bằng dịch vụ PHP trên VPS của bạn)
if ! systemctl is-active --quiet php7.4-fpm.service; then
  # If not running, send message to Telegram
  MESSAGE="PHP service is down!"
  curl -s -X POST https://api.telegram.org/bot$BOT_API_KEY/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
fi

sleep 1
done

Sửa dòng 6, 7, 10, 17, 24 cho phù hợp với bot Telegram và dịch vụ bạn đang sử dụng

Sửa xong thì Ctrl+O -> Enter -> Ctrl+X để save và exit.

Ý nghĩa của đoạn code trên là nó cứ check tình trạng của PHP, Mysql, Nginx,

  • Nếu PHP, Mysql, Nginx chạy thì thôi, không làm gì
  • Nếu PHP, Mysql, Nginx không chạy thì gửi thông báo tới Telegram
  • Chạy xong xuôi thì ngừng 1s, sau đó chạy lại từ đầu 😀

Tiếp theo chạy các dòng code bên dưới để nó tự chạy ngầm và tự chạy lại sau khi reboot VPS

chmod +x /usr/local/bin/monitor_service.sh
nohup /usr/local/bin/monitor_service.sh >> ./out 2>&1 <&- &
crontab -l > monitor_service
echo "@reboot nohup /usr/local/bin/monitor_service.sh >> ./out 2>&1 <&- &" >> monitor_service
crontab monitor_service
Đoạn code này tác giả không quản lý phần thông báo, cứ check thấy dịch vụ ngừng là cứ gửi =)) nếu trang của bạn kiểu bị lỗi sập Mysql, là bên Telegram cứ liên tục gửi tin nhắn, khá lú người 😀

2. Monitor and restart PHP, Mysql, Nginx

Về mặt ý tưởng, bạn cũng có thể làm thêm 1 chút, để khi check PHP, Mysql, Nginx, nếu thấy dịch vụ nào ngừng chạy, nó tự khởi động lại, sau đó thông báo tới Telegram cho bạn biết

#!/bin/bash
while true
do

# Set up Telegram bot API and chat ID
BOT_API_KEY="6360723418:AAF1aya50fEi6sVuOwhXp53IV19siP3gqLc"
CHAT_ID="489842337"

# Check if MySQL service is running  
if ! systemctl is-active --quiet mysql.service; then
  # If not running, restart and send message to Telegram
    sudo service mysql restart
    MESSAGE="MySQL Service was down. Restarting now"
    curl -s -X POST https://api.telegram.org/bot$BOT_API_KEY/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
fi

# Check if Nginx web server is running  (Thay bằng dịch vụ webserver trên VPS của bạn)
if ! systemctl is-active --quiet nginx.service; then
  # If not running, restart and send message to Telegram
    sudo service nginx restart
    MESSAGE="Nginx Service was down. Restarting now"
    curl -s -X POST https://api.telegram.org/bot$BOT_API_KEY/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
fi

# Check if PHP service is running (Thay bằng dịch vụ PHP trên VPS của bạn)
if ! systemctl is-active --quiet php7.4-fpm.service; then
  # If not running, restart and send message to Telegram
    sudo service php7.4-fpm restart
    MESSAGE="PHP Service was down. Restarting now"
    curl -s -X POST https://api.telegram.org/bot$BOT_API_KEY/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
fi

sleep 1
done

Mình chỉ thêm phần service restart, với sửa lại nội dung thông báo, còn lại cơ bản tương tự code 1 cả 😛

Tiếp theo chạy các dòng code bên dưới để nó tự chạy ngầm và tự chạy lại sau khi reboot VPS

chmod +x /usr/local/bin/monitor_service_restart.sh
nohup /usr/local/bin/monitor_service_restart.sh >> ./out 2>&1 <&- &
crontab -l > monitor_service_restart
echo "@reboot nohup /usr/local/bin/monitor_service_restart.sh >> ./out 2>&1 <&- &" >> monitor_service_restart
crontab monitor_service_restart

2 đoạn code trên mình cho chạy ngầm qua nohup, gần như nó chạy liên tục, không bị giới hạn như dùng cron, 1 phút chạy 1 lần, nên thông báo gần như là tức thời, hiệu quả hơn

Làm xong xuôi nếu thích bạn cũng có thể tạo thành file bash auto toàn bộ các quá trình vào 1 dòng code cho nhanh, sau này có cài lại VPS thì chỉ chạy 1 dòng code là đủ

Kết luận

Trước đây mình rất thích phong cách của code thứ 2, dịch vụ chạy lỗi, tự restart lại dịch vụ, quản trị nhàn bỏ xừ 😀

Có điều trên Linux, các dịch vụ chạy cực kì ổn định, thường nếu không có gì đặc biệt, chạy vài năm không phải khởi động lại dịch vụ nào là bình thường

Nó phải lỗi nghiêm trọng lắm, thì mới sập nổi, mà sập thì cần tìm hiểu nguyên nhân để xử lý, chứ cứ lỗi rồi khởi động lại dịch vụ thì quản trị khá là ngu học

Mỗi cái mình cũng mù tịt kiến thức về server 😀 Mysql quá tải sập, thường mình cũng …. chịu, không biết cách nào để xứ lý thêm, ngoài chuyện restart lại dịch vụ 😀 thành ra mình đang sử dụng code thứ 2, để tự khởi động lại dịch vụ 😛 phần vì nó cũng có hỗ trợ gửi thêm tin nhắn, ít ra mình cũng biết là server vừa có lỗi để có thể vào xem 😛

Nếu cài server cho nhiều khách hàng, hoặc server cá nhân ít vào, thì mình thấy quản trị cơ bản nhất là cứ cài cái code 2 vào là đủ, cũng hiếm cần quan tâm thêm cái gì 😀

Comment policy: We love comments and appreciate the time that readers spend to share ideas and give feedback.
Notes: However, those deemed to be spam or solely promotional will be deleted.

You can create a Gravatar account, add avatar, then use that email to comment here, your account will have a more beautiful Avatar, easier to recognize with other members.

Please use real emails, you can receive notifications when comments are replied