テスト目的でデータベースを1つのサーバーから別のサーバーに転送するための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
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""
Server2:
# 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
2つの問題があります。
Root権限が必要なものを実行していますが、それらを通常のユーザーとして実行しています。
完全なPATHなしでコマンド名を使用しているため、cronによって開かれたセッションはそれらの場所を認識していません。
1.を修正するには、crontab -e
を使用せず、代わりに/etc/crontab
を編集するか、さらに簡単にSudo crontab -e
を実行してrootのcrontabに追加します。次に、dropdb.sh
を編集し、su
を削除します(スクリプトはrootによって起動されるため、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
または、スクリプトを編集して、すべてが絶対パスを使用していることを確認します(つまり、service
ではなく/usr/sbin/service
)。