web-dev-qa-db-ja.com

crontabから実行されないbashスクリプト

次のbashスクリプトがあります。

#!/bin/bash
mysqldump -u ******** -p********  --all-databases | gzip > /home/srvlinux01/MySQLBackups/database_$(date +\%Y-\%m-\%d).sql.gz

次の権限を持つ/home/srvlinux01/MySQLBackups/としてbackup.shにあります

-rwxr--r-- 1 root       root           134 feb 27 12:48 backup.sh

Sudo crontab -eにcronjobを設定して、毎日、夜に実行します

#Automatic MySQL backup
30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh

しかし、私は次のエラーをメールで受け取ります:

sh: 0: Can't open /home/srvlinux01/MySQLBackups/backup.sh

私はさまざまなセットアップを試してきましたが、何が間違っているのかわかりません。スクリプトを手動で実行でき、すべてが完璧に進むため、cronjobエントリに何か問題があると思いますが、実際には何を理解できないのでしょうか。私がそれを理解するのを手伝ってもらえますか?ありがとう!

19
Mateusz Kapusta

CronにPATHを指定する必要があります。例えば:

Shell=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin 

あなたの場合、これをコマンドの前に入れてみてください。 PATH変数が必要な理由の詳細については、 この質問 のコミュニティWikiを確認してください。以下は抜粋です。基本的には、cronは/etc/environmentを読み取らないという考え方です。

一般的な「落とし穴」は、PATH環境変数が異なることです。おそらくcronスクリプトは、/opt/someApp/binsomecommandに追加した/etc/environmentのコマンドPATHを使用しますか? cronはそのファイルを読み取らないため、cronで実行するとスクリプトからsomecommandを実行すると失敗しますが、端末で実行すると機能します。これを回避するには、スクリプトの上部で独自のPATH変数を設定するだけです。

16
don.joey
chmod +x /home/srvlinux01/MySQLBackups/backup.sh             

コマンドラインでフルパスでスクリプトを実行してみてください:

/home/srvlinux01/MySQLBackups/backup.sh

実行されていない場合-何か問題がある(パスエラー)

これがcrontabであることを確認してください

crontab -e 

須藤の:

Sudo crontab -e

ルートcrontabです-ルートはスクリプトを見つけることができません;)

crontabの「sh」を削除するだけです。

30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh
8
toe

Crontabファイルの設定に間違いが1つあります。以下の構成では、shプレフィックスを使用してシェルプロンプトと同じようにbackup.shを呼び出していますが、これはcronでは機能しない可能性があります。

#Automatic MySQL backup
30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh
  1. 必要に応じて、コメントで述べたように所有者を変更します。
  2. 実行可能にする。
    chmod a + x <ファイル名>
  3. これを反映するようにcrontabを更新します。 (ファイルを直接呼び出すと、ファイル内のシェバン行ごとにシェルが使用されます)

    #Automatic MySQL backup
    30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh
    

これが役立つことを願っています。

8
Naha