저는 Linux를 처음 사용하는 사용자입니다.
데이터베이스를 백업하기 위해 vagrant 사용자를 사용하여 crontab을 실행해 보았습니다.
* * * * * /usr/bin/mysqldump -h localhost -u root -p root mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz >/dev/null 2>&1
crontab을 실행하면 폴더에 백업 파일이 없습니다(권한 체계가 있는 백업/모두가 있습니다 755
).
여기서 오류가 발생합니다./var/log/syslog
Aug 16 11:55:01 precise64 CRON[2213]: (vagrant) CMD (/usr/bin/mysqldump -h localhost -u root -p root mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz >/dev/null 2>&1)
Aug 16 11:55:01 precise64 CRON[2212]: (CRON) info (No MTA installed, discarding output)
그래서 나는 생각한다
- 권한 거부로 인해 crontab이 백업 파일을 생성할 수 없다는 문제입니다.
- MTA가 설치되어 있지 않지만
>/dev/null 2>&1
비활성화된 crontab을 사용하여 이메일로 보내는 것에 관한 것입니다. 왜 오류가 발생합니까?
답변1
물론 실수는 메일 프로그램(sendmail, postfix 등)을 구현하고 활성화하지 않았다는 것입니다.
즉, 다른 질문은 >/dev/null 2>&1 이 경우 LAST 명령 gzip에만 적용/관련된다는 것입니다. 따라서 mysqldump에는 STDERR로 가는 특정 유형의 출력이 있어야 합니다.
당신이하고 싶은 일을 수행하는 올바른 방법은 다음과 같습니다.
* * * * * (command | command ) >/dev/null 2>&1
답변2
다음을 입력할 수 있습니다:
MAILTO=""
crontab 파일 시작 부분에 이렇게 하면 이메일 전송을 시도하지 못하게 됩니다.
답변3
명령을 실행하는 사용자가 출력이 기록되는 디렉터리에 속 crontab
하고 권한이 있으면 해당 디렉터리에 쓸 수 없습니다. 이 문제를 해결할 수도 있습니다.vagrant
root
755
sudo chown vagrant /var/backup/all
이것이 문제인지 확인하려면 파일에 써 보십시오 /tmp
.
그러나 또 다른 문제가 있습니다. 이와 같은 명령은
mysqldump mydb | gzip > database.sql.gz >/dev/null 2>&1
데이터베이스 덤프를 database.sql.gz
및 에 기록합니다 /dev/null
. 오류 메시지를 표준 출력에
복사합니다 2>&1
. 즉, 오류 메시지도 기록합니다 database.sql.gz
. 압축된 데이터 사이에 오류 메시지 텍스트를 기록하므로 압축 파일이 손상됩니다. 표준 오류 스트림에 무언가를 쓸 때만 문제가 발생하므로 테스트하면 제대로 작동할 수 있습니다. stderr에 대한 출력은 단지 경고일 수 있지만 다른 모든 것은 작동합니다.
압축된 데이터베이스 덤프를 sql.gz 파일에 기록하고 여기에 오류를 기록하려고 한다고 가정합니다 /dev/null
. 이렇게 하려면 출력 스트림을 별도로 유지하고 오류 스트림을 출력 스트림에 복사하지 마십시오. 다음과 같은 파일로 전달합니다.
mysqldump mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz 2>/dev/null
"(MTA가 설치되지 않음, 출력 삭제)"라는 오류 메시지는 오류 출력을 보낼 수 없음을 알려주는 cron입니다. /dev/null
오류를 무엇으로 리디렉션하더라도 보낼 내용이 없기 때문에 이는 궁극적으로 문제가 되지 않습니다 . 하지만 현재 오류 메시지가 전송되고 있는 것 같습니다. 이를 통해 위의 결과를 확인할 수 있습니다.