Vấn đề về tập lệnh Shell: tập lệnh công việc cron để khởi động lại máy chủ MySQL khi nó vô tình dừng


11

Tôi có tập lệnh này, tôi đang sử dụng nó để thiết lập công việc CRON để thực thi tập lệnh này, vì vậy nó có thể kiểm tra xem dịch vụ MySQL có đang chạy hay không; nếu không thì nó khởi động lại dịch vụ MySQL:

#!/bin/bash
service mysql status| grep 'mysql start/running' > /dev/null 2>&1
if [ $? != 0 ]
then
    sudo service mysql restart
fi

Tôi đã thiết lập công việc cron như.

sudo crontab -e

và sau đó thêm vào,

*/1 * * * * /home/ubuntu/mysql-check.sh

Vấn đề là nó khởi động lại MySQL trên mỗi lần thực thi công việc cron .. ngay cả khi máy chủ đang chạy, nó khởi động lại dịch vụ MySQL, điều chỉnh trong tập lệnh để thực hiện điều đó.


tại sao bạn có một `\` trước shebang của bạn? Nếu nó ở đó để giữ cho nó không giống như một bình luận, thì nó không cần thiết. Shebangs được đối xử đặc biệt như thế nào bằng Bash, như trong họ không cần phải được thoát bởi vì họ không bình luận theo nghĩa là một lời nhận xét là một đoạn mã đó là không được đánh giá ở tất cả .
Alexej Magura

1
Ngoài ra, tránh sử dụng [ ... ]hoặc test <TEST>trong Bash. Chúng không được dùng nữa . Sử dụng [[ ... ]]thay thế. Chỉ sử dụng [ ... ]và / hoặc test <TEST>khi [[ ... ]]không có sẵn.
Alexej Magura

1
Đây là kịch bản shell đầu tiên tôi đã thử bằng cách sử dụng một số tập lệnh có sẵn, tôi chỉ sửa đổi nó. không biết nhiều về cú pháp. vấn đề vẫn còn đó là mysql khởi động lại trên mỗi lần thực thi công việc CRON @AlexejMagura
Mũ rơm

1
Hãy thử một cái gì đó như thế này: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi Cái này làm gì, nó khởi động một subshell, trong đó service mysql status | grep 'mysql start/running' &> /dev/nullđược chạy, trạng thái return (exit) của subshell đã nói sau đó được chuyển đến câu lệnh if, sau đó kiểm tra xem nó có khác không không, và nếu nó không khác không thì nó chạy thenkhối.
Alexej Magura

Không mys mys viết quá trình pid của nó vào tập tin pid? Nếu có, bạn có thể sử dụng nó như một cách khác để kiểm tra trạng thái mysql của bạn
Flint

Câu trả lời:


17

Tôi nghi ngờ rằng bạn thiết lập công việc định kỳ để thực thi tập lệnh này trong tệp crontab của bạn chứ không phải trong tệp crontab gốc. Điều này không đúng vì nếu bạn không chạy service mysql statusbằng root, mysqldịch vụ sẽ không được công nhận.

Vì vậy, sửa đổi tập lệnh như sau:

#!/bin/bash
if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]
then
    /usr/sbin/service mysql start
fi

Hãy chắc chắn rằng có thể thực thi được:

chmod +x /path/to/script

Sau đó thêm một mục mới trong crontab gốc như sau:

  • Chỉnh sửa tập tin crontab gốc bằng cách sử dụng:

    sudo crontab -e
  • Và thêm dòng sau vào tập tin:

    */1 * * * * /path/to/script
  • Lưu ý: Tôi đã đặt công việc định kỳ cho mỗi phút, nhưng bạn có thể thay đổi theo ý muốn hoặc theo bạn nghĩ là tốt hơn. Xem http://en.wikipedia.org/wiki/Cron theo nghĩa này.


Tôi thiết lập nó là crontab, tôi đoán vấn đề là với kịch bản, tôi sẽ thử kịch bản trên
Mũ rơm

./mysql-check.sh: line 2: [: =~: binary operator expectedlỗi trong kịch bản trên
Mũ rơm

Tôi tin rằng bạn muốn phủ nhận sự phù hợp với regex đó !nếu bạn thực sự có ý định khởi động lại dịch vụ mysql khi gặp sự cố
Flint

@Flint Điều đó cũng đúng ... Xin lỗi, tôi vẫn đang uống cà phê buổi sáng của mình. :)
Radu Rădeanu

@D_Vaibhav Bây giờ mọi thứ sẽ ổn. Vì vậy, hãy thử ngay bây giờ, như root.
Radu Rădeanu

3

Câu trả lời của Radu gần như đã làm việc. Tôi đã phải thiết lập đường dẫn để làm cho nó hoạt động:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi

1
Trong thực tế, tôi đã thiết lập của tôi PATHtrong tập tin crontab. Dù sao, trong trường hợp của bạn, bạn cần sử dụng PATH=/usr/sbin:$PATHhoặc sử dụng đường dẫn đầy đủ servicekhi tôi chỉnh sửa câu trả lời của mình.
Radu Rădeanu

2

Câu trả lời của Radu hoạt động - nhưng kịch bản này cũng hoạt động

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi

Tôi đã kiểm tra pgrep mysqlvà tôi đã nhận được 0mysql bị dừng và 2chạy. Do đó, tôi đặt điều kiện là if [[ $(pgrep mysql | wc -l) = 0 ]];và nó làm việc cho tôi.
Alin C

có lẽ tốt hơn theo cách của bạn ... Tôi sẽ thực hiện thay đổi.
JxAxMxIxN

Kịch bản này hoạt động với /bin/bash(nó không hoạt động mà không có bash). */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.