cron에 예약된 다음 bash 스크립트를 사용하여 백업을 수행하려고 합니다.
#!/bin/bash
echo "Hello"
while read table
do
/usr/bin/mysqldump -uroot -pxxxxxx CMAYA_RadiusUserLogs $table > sc_back/${table}.sql
done < tables.txt
크론 배열은 다음과 같습니다
58 16 * * * root /bin/sh -x /backup/call_backup.sh > /backup/backup.log
/var/log/cron은 다음과 같습니다
Jul 3 16:27:01 (root) CMD (/bin/sh -x /backup/backup.sh > /backup/backup.log)
/백업/backup.log
[root@ backup]# cat backup.log
Hello
이 동일한 스크립트를 수동으로 실행하면 제대로 작동하고 스크립트에 입력한 다른 명령은 cron 작업에서 작동합니다.
답변1
tables.txt 경로를 수정했지만 문제는 여전히 존재하지만 std err 2>&1을 리디렉션한 후 작동하기 시작했습니다. "경고: 명령줄 인터페이스에서 비밀번호를 사용하는 것은 안전하지 않을 수 있습니다"라는 경고 메시지의 이유를 찾았습니다. 문제를 일으켰습니다. 이 메시지가 표시된 후 mysqldump가 종료되었으므로 오류를 리디렉션하고 작업을 시작했습니다. mysql을 5.6으로 업그레이드한 후에 이런 현상이 나타났습니다.
#!/bin/bash
echo "Hello"
while read table
do
touch sc_back/${table}.sql
/usr/bin/mysqldump -uroot -pxxxxx CMAYA_RadiusUserLogs $table > /backup /sc_back/${table}.sql
done < /backup/tables.txt
답변2
문제는 스크립트의 마지막 줄에 파일의 전체 절대 경로를 입력해야 한다는 것입니다 tables.txt
. 그렇지 않으면 cron 작업이 파일을 찾을 수 없습니다.
스크립트를 수동으로 시작할 때 스크립트가 작동하는 이유는 파일 tables.txt
이 현재 디렉터리에 있으므로 시스템이 쉽게 찾을 수 있기 때문입니다.
답변3
cron이 스크립트를 실행할 때 현재 작업 디렉터리는 cron 테이블에 대한 사용자의 홈 디렉터리(분명히 /root)이고 스크립트와 해당 파일은 /backup 아래에 있습니다. 이것이 바로 스크립트가 table.txt를 찾을 수 없고 테이블 루프가 반복되지 않는 이유입니다.
먼저 스크립트 디렉터리로 CD를 이동한 다음 실행해야 합니다. 예를 들면 다음과 같습니다.
58 16 * * * root cd /backup && /bin/sh -x call_backup.sh > backup.log