쉘 스크립트 문제 : 실수로 중지되면 MySQL 서버를 다시 시작하는 cron 작업 스크립트


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

문제는 모든 cron 작업 실행마다 MySQL을 다시 시작한다는 것입니다. 서버가 실행 중이더라도 MySQL 서비스를 다시 시작하면 스크립트의 수정 내용이 수정됩니다.


왜 셰방 앞에`\`가 있습니까? 주석처럼 보이지 않게하려면 불필요합니다. Shebang 은 주석이 전혀 평가 되지 않은 코드라는 의미에서 주석이 아니기 때문에 탈출 할 필요가 없으므로 Bash와 같이 특별하게 취급 됩니다 .
Alexej Magura

1
또한, 사용하지 않는 [ ... ]또는 test <TEST>배쉬에서. 그들은있는 구문을 사용되지 . [[ ... ]]대신 사용하십시오 . 만 사용 [ ... ]및 / 또는 test <TEST>[[ ... ]]입니다 하지 가능합니다.
Alexej Magura

1
이것은 사용 가능한 스크립트를 사용하여 시도한 첫 번째 셸 스크립트입니다. 방금 수정했습니다. 구문에 대해 잘 모릅니다. 문제는 여전히 모든 CRON 작업 실행시 mysql이 다시 시작됩니다 @AlexejMagura
Straw Hat

1
다음과 같이 해보십시오 : if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi 서브 쉘을 시작하고, service mysql status | grep 'mysql start/running' &> /dev/null실행되고, 해당 서브 쉘 의 리턴 (종료) 상태가 if 문으로 전달되어 0이 아닌지 확인합니다. 0 이 아닌 경우 then블록을 실행합니다 .
Alexej Magura

mysql은 프로세스 pid를 pid 파일에 쓰지 않습니까? 그렇다면 mysql 상태를 확인하는 다른 방법으로 사용할 수 있습니다
Flint

답변:


18

루트 crontab 파일이 아닌 crontab 파일에서이 스크립트를 실행하도록 cron 작업을 설정 한 것으로 보입니다. 루트로 실행 하지 않으면 서비스가 인식되지 않기 때문에 이것은 올바르지 않습니다.service mysql statusmysql

따라서 다음과 같이 스크립트를 수정하십시오.

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

실행 가능한지 확인하십시오.

chmod +x /path/to/script

그런 다음 루트 crontab에 다음과 같이 새 항목을 추가하십시오.

  • 다음을 사용하여 루트 crontab 파일을 편집하십시오.

    sudo crontab -e
  • 파일에 다음 줄을 추가하십시오.

    */1 * * * * /path/to/script
  • 참고 : 매분마다 cron 작업을 설정했지만 원하는대로 또는 더 나은 방식으로 변경할 수 있습니다. 이런 의미에서 http://en.wikipedia.org/wiki/Cron 을 참조하십시오 .


나는 crontab으로 설정, 문제는 스크립트에 있다고 생각합니다, 나는 위의 스크립트를 시도합니다
Straw Hat

./mysql-check.sh: line 2: [: =~: binary operator expected위 스크립트에서 오류
Straw Hat

!충돌시 mysql 서비스를 실제로 다시 시작하려는 경우 정규 표현식 일치를 무시하고 싶습니다.
Flint

@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
사실 나는 PATHcrontab 파일에서 내 설정 했습니다. 어쨌든, 귀하의 경우 내 답변을 편집 PATH=/usr/sbin:$PATH할 때 전체 경로 를 사용 하거나 사용해야합니다 service.
Radu Rădeanu

2

Radu의 답변은 효과가 있지만이 스크립트도 효과가 있습니다.

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

나는 점검하고 mysql이 중지되고 실행 중임을 pgrep mysql알았다 . 그래서 나는 조건을 설정 했고 그것은 나를 위해 일했습니다. 02if [[ $(pgrep mysql | wc -l) = 0 ]];
Alin C

아마 당신의 방법이 더 나을 것입니다 ... 나는 변화를 만들 것입니다.
JxAxMxIxN

이 스크립트는 /bin/bashbash 없이는 작동하지 않습니다. */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.