テストのために、あるサーバーから別のサーバーにデータベースを転送する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
2つの問題があります。
root権限を必要とするプログラムを実行していますが、通常のユーザーとして実行しています。
使用するコマンド名には絶対パスがないため、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
。