테스트를 위해 한 서버에서 다른 서버로 데이터베이스를 전송하는 4개의 스크립트가 있습니다. 이 스크립트는 밤에 자동으로 실행됩니다. 스크립트를 수동으로 호출하면 오류가 발생하지 않지만 수동으로 실행하지 않으면 데이터가 전송되는 것을 볼 수 없습니다.
서버 1:
ps -ef | grep cron
root 2350 1 0 Apr23 ? 00:00:26 /usr/sbin/cron
root 14293 9533 0 10:52 pts/4 00:00:00 grep cron
서버 2:
ps -ef | grep cron
root 11269 8661 0 10:52 pts/1 00:00:00 grep cron
root 21726 1 0 Jan30 ? 00:00:31 /usr/sbin/cron
서버 1
crontab -e
# m h dom mon dow command
0 3 * * * /home/deploy/scripts/clearzip.sh
19 2 * * * /media/attachment/send_db.sh
데이터베이스 파일 보내기
#! /bin/bash
pg_dump -C "DB_NAME" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB_NAME""
pg_dump -C "DB2" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB2""
서버 2:
# m h dom mon dow command
12 2 * * * ./home/postgres/stop_services.sh
17 2 * * * ./home/postgres/dropdb.sh
55 5 * * * ./home/postgres/start_services.sh
stop_services.sh:
#! /bin/bash
echo > >(tee -i /home/deploy/logfile.txt)
sh /home/deploy/tomcat7/bin/catalina.sh stop
killall java
killall screen
dropdb.sh
su -c "psql -c 'drop database "DB1";'" -s /bin/sh postgres
su -c "psql -c 'create database "DB1";'" -s /bin/sh postgres
su -c "psql -c 'drop database "DB2";'" -s /bin/sh postgres
su -c "psql -c 'create database "DB2";'" -s /bin/sh postgres
내가 무엇을 잘못할 수 있었나요? 어떤 아이디어가 있나요?
고쳐 쓰다
로그 파일의 오류
could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
/home/postgres/start_services.sh: line 5: service: command not found
/home/postgres/start_services.sh: line 6: service: command not found
답변1
두 가지 문제가 있습니다.
루트 권한이 필요한 프로그램을 실행하고 있지만 일반 사용자로 실행하고 있습니다.
사용하는 명령 이름에는 전체 경로가 없으므로 cron이 연 세션은 해당 명령 이름을 어디서 찾을 수 있는지 알 수 없습니다.
1.을 수정하려면 을 사용하지 말고 crontab -e
편집 /etc/crontab
하거나 더 간단하게 sudo crontab -e
루트에 추가하는 crontab을 실행하십시오. 그런 다음 편집 dropdb.sh
하고 삭제합니다 su
(이제 스크립트는 루트로 시작되므로 필요하지 않습니다 su
).
문제 2를 해결하는 가장 쉬운 방법은 crontab에서 PATH를 정의하는 것입니다. 다음과 같아야 합니다.
PATH=/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin
# m h dom mon dow command
12 2 * * * ./home/postgres/stop_services.sh
17 2 * * * ./home/postgres/dropdb.sh
55 5 * * * ./home/postgres/start_services.sh
또는 스크립트를 편집하여 모두 절대 경로를 사용하는지 확인하십시오(대신 /usr/sbin/service
) service
.