ปัญหาเชลล์สคริปต์: สคริปต์งาน cron เพื่อรีสตาร์ทเซิร์ฟเวอร์ MySQL เมื่อหยุดโดยไม่ตั้งใจ


11

ฉันมีสคริปต์นี้ฉันใช้เพื่อตั้งค่างาน CRON เพื่อเรียกใช้สคริปต์นี้เพื่อให้สามารถตรวจสอบว่าบริการ MySQL กำลังทำงานอยู่หรือไม่ ถ้าไม่เช่นนั้นจะเริ่มบริการ MySQL:

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

ฉันมีงานติดตั้ง cron เป็น

sudo crontab -e

แล้วเพิ่ม

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

ปัญหาคือมันรีสตาร์ท MySQL ในทุก ๆ การประมวลผลงาน cron .. แม้ว่าเซิร์ฟเวอร์จะรันมันก็จะเริ่มบริการ MySQL ใหม่สิ่งที่แก้ไขในสคริปต์เพื่อทำเช่นนั้น


ทำไมคุณถึงมี `` `อยู่ตรงหน้า Shebang ของคุณ? หากมีไว้เพื่อไม่ให้มันดูเหมือนความคิดเห็นแสดงว่าไม่จำเป็น shebangsได้รับการรักษาพิเศษเช่นโดยการทุบตีในขณะที่พวกเขาไม่จำเป็นที่จะต้องหนีเพราะพวกเขาไม่ได้แสดงความคิดเห็นในแง่ที่ว่าแสดงความคิดเห็นเป็นชิ้นส่วนของรหัสที่ไม่ได้รับการประเมินในทุก
Alexej Magura

1
นอกจากนี้หลีกเลี่ยงการใช้[ ... ]หรือtest <TEST>ใน Bash พวกเขากำลังเลิกใช้ไวยากรณ์ ใช้[[ ... ]]แทน เพียงใช้[ ... ]และ / หรือtest <TEST>เมื่อ[[ ... ]]เป็นไม่สามารถใช้ได้
Alexej Magura

1
นี่เป็นเชลล์สคริปต์ตัวแรกที่ฉันลองโดยใช้สคริปต์ที่มีอยู่ฉันเพิ่งแก้ไขมัน ไม่เข้าใจไวยากรณ์มากนัก ปัญหายังคงมี mysql เริ่มต้นใหม่ในทุกการดำเนินงาน CRON @AlexejMagura
หมวกฟาง

1
ลองสิ่งนี้: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi สิ่งนี้ทำอะไรบ้างมันเริ่มต้นขึ้นที่ subshell หรือไม่ซึ่งservice mysql status | grep 'mysql start/running' &> /dev/nullจะถูกเรียกใช้สถานะ return (exit) ของ subshell ที่กล่าวนั้นจะถูกส่งผ่านไปยัง if-statement ซึ่งจะตรวจสอบว่าไม่ใช่ศูนย์หรือไม่ และถ้ามันเป็นไม่ได้ที่ไม่ใช่ศูนย์แล้วมันวิ่งthenบล็อก
Alexej Magura

ไม่ใช่ mysql ที่เขียนโพรเซส pid ไปยัง pid หรือไม่? หากคุณสามารถใช้มันเป็นอีกวิธีหนึ่งในการตรวจสอบสถานะ mysql ของคุณ
ฟลินท์

คำตอบ:


18

ฉันสงสัยว่าคุณตั้งค่างาน cron เพื่อรันสคริปต์นี้ในไฟล์ crontab ของคุณและไม่ใช่ในไฟล์ root crontab สิ่งนี้ไม่ถูกต้องเพราะหากคุณไม่ได้ทำงานservice mysql statusในฐานะรูทmysqlบริการจะไม่ได้รับการยอมรับ

ดังนั้นแก้ไขสคริปต์ดังต่อไปนี้:

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

ตรวจสอบให้แน่ใจว่าสามารถใช้งานได้:

chmod +x /path/to/script

จากนั้นเพิ่มรายการใหม่ใน root crontab ดังนี้:

  • แก้ไขไฟล์ crontab รูทโดยใช้:

    sudo crontab -e
  • และเพิ่มบรรทัดต่อไปนี้ในไฟล์:

    */1 * * * * /path/to/script
  • หมายเหตุ: ฉันได้ตั้งค่างาน cron ทุกนาที แต่คุณสามารถเปลี่ยนได้ตามที่คุณต้องการหรือตามที่คุณคิดว่าดีกว่า ดูhttp://en.wikipedia.org/wiki/Cronในแง่นี้


ฉันติดตั้งมันเป็น crontab ฉันคิดว่าปัญหาอยู่ที่สคริปต์ฉันจะลองสคริปต์ด้านบน
หมวกฟาง

./mysql-check.sh: line 2: [: =~: binary operator expectedข้อผิดพลาดในสคริปต์ด้านบน
หมวกฟาง

ฉันเชื่อว่าคุณต้องการลบล้าง regex ที่จับคู่กับ!ถ้าคุณตั้งใจจะเริ่มบริการ mysql ใหม่เมื่อเกิดข้อผิดพลาด
Flint

@ ฟลินท์จริงอยู่ด้วย ... ขอโทษฉันยังคงดื่มกาแฟตอนเช้า :)
Radu Rădeanu

@D_Vaibhav ツตอนนี้ทุกอย่างก็โอเค ดังนั้นลองตอนนี้เป็นราก
Radu Rădeanu

3

คำตอบของ Radu เกือบจะได้ผล ฉันต้องกำหนดเส้นทางเพื่อให้มันทำงาน:

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

1
อันที่จริงฉันตั้งค่าPATHไฟล์ crontab แล้ว อย่างไรก็ตามในกรณีของคุณคุณจำเป็นต้องใช้PATH=/usr/sbin:$PATHหรือใช้เส้นทางแบบเต็มserviceเช่นฉันแก้ไขคำตอบของฉัน
Radu Rădeanu

2

คำตอบของ Radu นั้นใช้ได้ - แต่สคริปต์นี้ก็ใช้ได้เช่นกัน

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

ฉันตรวจสอบpgrep mysqlและฉันได้รับ0mysql ถูกหยุดและ2ทำงาน ดังนั้นฉันจึงกำหนดเงื่อนไขif [[ $(pgrep mysql | wc -l) = 0 ]];และใช้งานได้สำหรับฉัน
Alin C

อาจเป็นวิธีที่ดีกว่าของคุณ ... ฉันจะทำการเปลี่ยนแปลง
JxAxMxIxN

สคริปต์นี้ทำงานร่วมกับ/bin/bash(มันไม่ทำงานโดยไม่ต้องทุบตี) */1 * * * * /bin/bash /root/mysql-check.sh
Mahfuz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.