Một trong những vấn đề hay gặp của mình là mình thường xuyên gặp tình trạng máy chủ bị treo trong quá trình vận hành. Thông thường là do một dịch vụ nào đó hoạt động vượt công suất thông thường dẫn đến treo dịch vụ đó (dễ gặp nhất là mysqld ý). Lỗi hay gặp nhất là Out Of Memory (OOM) do hết RAM.
Đầu tiên, chúng ta cần kiểm tra sơ bộ xem đã trước khi thực hiện. Cách mà nhiều người hay làm nhất đó là kiểm tra var/log. Ngoài ra bạn có thể kiểm tra nhanh bằng lệnh dmesg
# dmesg [13784267.946710] Out of memory in UB 2844: OOM killed process 1968 (mysqld) score 0 vm:1767928kB, rss:102780kB, swap:527836kB [13806166.053265] Out of memory in UB 2844: OOM killed process 5889 (mysqld) score 0 vm:1777520kB, rss:33176kB, swap:314276kB [13806170.976511] Out of memory in UB 2844: OOM killed process 5846 (php-fpm) score 0 vm:329920kB, rss:37732kB, swap:84896kB [13815932.543655] Out of memory in UB 2844: OOM killed process 12722 (mysqld) score 0 vm:1777528kB, rss:43744kB, swap:327912kB [13815937.812526] Out of memory in UB 2844: OOM killed process 20416 (mysqld) score 0 vm:234944kB, rss:137512kB, swap:0kB |
Để khắc phục tình trạng ngắt dịch vụ nữa chừng, chúng ta cùng nhau với một script nhỏ khởi động lại dịch vụ nhằm tránh cho dịch vụ bị gián đoạn với người dùng.
Phụ mục
Kiểm tra trạng thái dịch vụ
Trước tiên, chúng ta kiểm tra trong điều kiện hoạt động ổn định thì trạng thái dịch vụ sẽ như thế nào. Dựa trên điều này, tâ sẽ tạo câu điều kiện (condition) khi dịch vụ gặp sự cố.
Chúng ta sẽ thử đùng 2 lệnh ps và netstat để kiểm tra như sau:
[root@sv ~]# ps -ef | awk '{ print $8 }' | grep mysqld | wc -l 1 [root@sv ~]# netstat -tulpn | awk '{ print $7 }' | grep mysqld | wc -l 1 |
Chú thích:
- ps -ef: nó sẽ xuất ra màn hình tất cả các process đang chạy cùng thông tin của process đó.
- | awk ‘{ print $8 }’ : lấy ra cột thứ 8 trong kết quả lênh ps -ef
- | grep mysqld: lấy ra những dòng có chữ mysqld
- | wc -l: đếm số dòng có chữ mysqld
Lệnh start services và init.d
Trên hệ thống linux có nhiều cách để start dịch vụ, như systemctl start, services mysqld restart . Nhưng nếu dịch vụ quản lý trong /etc/init.d bạn có thể dùng /etc/init.d/mysql start để start dịch vụ.
Ngoài ra, bạn có thể áp dụng nhiều lệnh khấc để quản lý dịch vụ như stop, restart…
/etc/init.dchứa các tập lệnh được sử dụng bởi các công cụ khởi động System V (SysVinit). Đây là gói quản lý dịch vụ truyền thống dành cho Linux, chứa initchương trình (quy trình đầu tiên được chạy khi kernel đã khởi tạo xong) cũng như một số cơ sở hạ tầng để khởi động và dừng dịch vụ và định cấu hình chúng. Cụ thể, tập tin trong /etc/init.dnhững kịch bản shell mà đáp ứng start, stop, restart, và (khi được hỗ trợ) reloadlệnh để quản lý một dịch vụ cụ thể. Các tập lệnh này có thể được gọi trực tiếp hoặc (phổ biến nhất) thông qua một số trình kích hoạt khác (thường là sự hiện diện của một liên kết tượng trưng trong /etc/rc?.d/).
Viết script tự động restart lại dịch vụ bằng SSH
Bạn tạo một file auto-start-services.sh, mục đích chứa các lệnh cần thực thi. Chúng ta có thể sử dụng trình soạn thảo vi hay nano đều được. Mình sử dụng nano để soạn thảo như sau:
nano /bin/auto-start-services.sh
Sau khi tạo file, mình dán vào nội dung như sau:
#!/bin/bash service=mysqld ## gan ten dich vu nhu mot bien if (( $(ps -ef | awk '{ print $8 }' | grep mysqld | wc -l) > 0 )) # Neu tra ve 0 thi thuc hien start service then echo "$service ready running" else /etc/init.d/$service start fi |
Sau đó, ta thực hiện CHMOD lại file.
Vậy là xong file, bây giờ chúng ta cần tạo 1 cron job kiểm tra thường xuyên để nếu dịch vụ bị tắt thì mình lại khởi động nó lại.
Ở đây bạn có thể sử dụng cron job bằng lệnh crontab -e sau đó thêm đoạn mã sau vào:
crontab -e |
Sau 5 phút ta tiến hành gọi auto-start-services.sh để kiểm tra và tiến hành khởi động dịch vụ nếu nó bị tắt.
*/5 * * * * sh /bin/auto-start-services.sh |
Dễ òm.
Tham khảo từ: linuxcanban.com