web-dev-qa-db-ja.com

バックアップスクリプトを実行すると機能するのに、cron経由で実行すると機能しないのはなぜですか?

これは私のスクリプトです、backup_mongo.sh

#!/bin/bash
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix

私のcrontab -e

0   3  *   *   *    /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

スクリプトを正常に実行すると(上記のコマンドを実行すると)、スクリプトが機能し、ディレクトリ「mydb」が/ mongo- $ suffixに作成されます。

ただし、これをcrontabに入れると、/ mongo- $サフィックスが作成されますが、「mydb」ディレクトリは存在しません。/mongo- $ suffixには何もありません。

2
Alex

mongodumpPATHが含まれていない可能性があります。 mongodumpコマンドへの絶対パスを使用してみてください。

4
Cakemox

PATHの問題である可能性が非常に高いですが、crontabでPATHをオーバーライドしないことをお勧めします。

  • 行動を避けるのは本当に簡単
  • セキュリティリスクの可能性があります

フルパスを変数としてトリガーするすべてのバイナリを定義するための優れたbash/shコーディングスタイル

!#/bin/bash

RSYNC="/usr/bin/rsync"

後で変数を参照します。

$RSYNC /foo/bar baz

Crontabを実行しているユーザーを変更するための特定のオプションもあります。 mongodumpを含むPATHを定義したmongodumpというユーザーがいるとすると、このユーザーになってcrontabを編集できます。または、使用することもできます

/bin/bash /bin/su - mongodump -c /bin/bash /home/myuser/myproject/production/backup_mongo.sh

ルーツのcrontabで。

2
ansi_lumen

CronのデフォルトのPATHは制限されています。通常は/usr/bin:/bin。これらのディレクトリの外で何かを実行したい場合は、いくつかのオプションがあります

コマンドへのフルパスを使用します。 /path/to/mongodump/mongodump ...

Crontabで拡張PATHを定義します。例:.

    PATH=/usr/bin:/bin/:/path/to/mongodump
    0 3 * * * /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

実行しているスクリプトでPATHを定義します

#!/bin/bash
PATH=/usr/bin:/bin:/paath/to/mongodump
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix
1
user9517