Cron: cron이 실행 중인데도 내 cron 스크립트가 실행되지 않는 이유는 무엇입니까?

Cron: cron이 실행 중인데도 내 cron 스크립트가 실행되지 않는 이유는 무엇입니까?

테스트를 위해 한 서버에서 다른 서버로 데이터베이스를 전송하는 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

두 가지 문제가 있습니다.

  1. 루트 권한이 필요한 프로그램을 실행하고 있지만 일반 사용자로 실행하고 있습니다.

  2. 사용하는 명령 이름에는 전체 경로가 없으므로 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.

관련 정보