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

2つの問題があります。

  1. root権限を必要とするプログラムを実行していますが、通常のユーザーとして実行しています。

  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/serviceservice

おすすめ記事