Khi vận hành hệ thống máy chủ nhiều khi có những lỗi rất khoai cứ lâu lâu dịch vụ nó lại tự động dừng lại (auto stop service). Lỗi này có thể do VPS/Server thiếu RAM không được tối ưu tài nguyên hoặc có thể do lỗi code web, đòi hỏi sysadmin cần có thời gian để xử lý.
Dịch vụ thì luôn đòi hỏi online 24/24 mà phải shutdown chờ sửa lỗi thì phá sản mất. Do đó, trong trường hợp này chúng ta sẽ phải tạo shell script auto start service mỗi khi nó stop để giải quyết tình huống.
Nói chung lỗi này xảy ra với rất nhiều loại services phổ biến nhất vẫn là MySQL và httpd (webserver) với các thông báo lỗi:
Error establishing a database connection Database connection error (2): Could not connect to MySQL Database error
thuysys.tech refused to connect. Search Google for thuysys tech ERR_CONNECTION_REFUSED
Mình sẽ đặt tình huống giả định service mysql tự động stop không rõ nguyên nhân, chúng ta phải làm sao để tự động start mysql.
Trước hết phải phân tích tình huống và liệt kê ra các việc cần làm rồi chuyển hóa thành dòng lệnh trong file script.
- Làm sao kiểm tra khi nào dịch vụ stop, dùng câu lệnh nào để check được status của dịch vụ.
- Câu lệnh start dịch vụ khi lỗi.
- Cách viết script check status và start service khi lỗi xảy ra.
- Làm thế nào chạy script tự động.
Trên đây là những keyword chính đặt ra để giải quyết tình huống chúng ta sẽ đi giải đáp lần lượt từ trên xuống.
1. Cách kiểm tra status service
Có nhiều lệnh để kiểm tra trạng thái của dịch vụ xem có đang chạy hay không, bạn có thể dùng netstat
hoặc ps
nhưng phải kết hợp với các options để xuất được ra kết quả như ý.
Với mysql khi chạy trên máy chủ sẽ có 2 dấu hiệu để nhận diện nó, ví dụ mysql chạy với port 3306, có process name là mysql hay mysqld. Như vậy chúng ta chỉ cần chạy netstat và ps để xem có các dấu hiệu nhận biết đó không là được, nếu có thì service đang start còn không thì service đang stop.
Đây là 2 câu lệnh bạn cần:
ps -ef | awk '{ print $8 }' | grep mysqld | wc -l netstat -tulpn | awk '{ print $7 }' | grep mysqld | wc -l
Các bạn mới làm việc với linux có thể sẽ dị ứng với chuỗi lệnh bên trên, cảm thấy rất khó hiểu.
Mình hướng dẫn các bạn một cách đơn giản để hiểu ý nghĩa của chuỗi lệnh, bạn sử dụng SSH gõ từng đoạn lệnh nhỏ xem kết quả xuất ra màn hình như nào rồi thêm các đoạn khác vào. Như ví dụ trên mình sẽ nhập lệnh:
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
Như vậy sau khi chạy một trong hai lệnh trên chúng ta xẽ nhận được một số duy nhất 1 đồng nghĩa với mysql đang start nếu là 0 thì mysql stop.
2. Lệnh start service
Linux cũng có nhiều cách để start dịch vụ, trên CentOS 5/6/7 Ubuntu 10/12/14/15/16 chúng ta có những câu lệnh sau:
/etc/init.d/mysql start service mysql start systemctl mysql start
Với máy chủ Apache2 hay nginx nếu bị lỗi bạn cũng dùng một trong 3 lệnh trên để thực hiện start/stop/restart service được nhé.
3. Hướng dẫn viết shell script
Đã có đủ các thông tin cần thiết phần này chúng ta sẽ bắt tay vào viết script đầu tiên, với logic:
Ngắn gọn vậy thôi, bạn dùng trình soạn vi/vim hoặc nano tạo file auto_start_mysql.sh
vi /var/www/script/auto_start_mysql.sh
Với nội dung sau:
#!/bin/bash
service=mysqld
if (( $(ps -ef | awk '{ print $8 }' | grep mysqld | wc -l) > 0 ))
then
echo "$service chay ngon lanh"
else
/etc/init.d/$service start
fi
Trong script này chỉ có duy nhất một lệnh điều kiện if…else đơn giản, muôn hiểu cách viết lệnh, dấu chấm, dấu phảy, space, ngoặc đơn, ngoặc kép bạn phải tự mình đọc tài liệu cơ bản shell script trên google, mình không chi tiết hết được.
Chỉ cần chú ý chỗ chữ màu đỏ, mỗi OS sẽ có tên khác nhau lúc là mysql lúc lại mysqld bạn thay thế cho phù hợp với hệ thống của mình.
4. Tự động chạy shell script với crontab
Giờ đến bước tự động hóa công việc, bạn cần phân quyền thực thi script cho người dùng.
chmod +x /var/www/script/auto_start_mysql.sh
Tham khảo: cách chmod trên linux.
Chạy lệnh crontab -e
tạo crontab với nội dung bên dưới.
*/5 * * * * sh /var/www/script/auto_start_mysql.sh
Tham khảo: hướng dẫn dùng crontab.
Tùy mức độ quan trọng của service và tần suất xảy ra lỗi, bạn đặt thời gian chạy crontab phù hợp như bên trên mình để cứ 5 phút chạy script một lần.
Done.
Hy vọng bài viết sẽ giúp các bạn giải quyết được vấn đề của mình, chúc các bạn thành công.
Mình tìm không thấy nên mới hỏi ad. cảm ơn ad nhek!!!
Ad có tài liệu lập trình chụp ảnh với quay video qua webserver bằng ngôn ngữ php không cho mình xin với.
Cảm ơn Ad nhiều lắm!!!
Mình không biết code ^^, bạn search trên mạng nhiều mà.
Crontab của mình chạy được rồi bạn bây giờ mình muốn dừng file shell phải làm sao??
Mình không rõ làm sao lại không thấy crontab được thêm vào. Để cho nhanh bạn xoá shell script đi là xong. Cron chạy mà không có file shell script thì coi như vô tác dụng.
Ad cho e hỏi làm sao để tắt file SHELL SCRIPT TỰ ĐỘNG START DỊCH VỤ khi mà vào crontab -e không hiện ra dòng mình đã thêm vào trước đó. @reboot sh /var/www/html/chay.sh
Crontab bạn thêm vào đã chạy chưa.