web-dev-qa-db-ja.com

cron:cronが実行されているのに、cronスクリプトが実行されないのはなぜですか

テスト目的でデータベースを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
We are Borg

2つの問題があります。

  1. Root権限が必要なものを実行していますが、それらを通常のユーザーとして実行しています。

  2. 完全な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)。

3
terdon