次の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エントリに何か問題があると思いますが、実際には何を理解できないのでしょうか。私がそれを理解するのを手伝ってもらえますか?ありがとう!
CronにPATH
を指定する必要があります。例えば:
Shell=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin
あなたの場合、これをコマンドの前に入れてみてください。 PATH
変数が必要な理由の詳細については、 この質問 のコミュニティWikiを確認してください。以下は抜粋です。基本的には、cronは/etc/environment
を読み取らないという考え方です。
一般的な「落とし穴」は、PATH環境変数が異なることです。おそらくcronスクリプトは、
/opt/someApp/bin
のsomecommand
に追加した/etc/environment
のコマンドPATH
を使用しますか? cronはそのファイルを読み取らないため、cronで実行するとスクリプトからsomecommand
を実行すると失敗しますが、端末で実行すると機能します。これを回避するには、スクリプトの上部で独自のPATH
変数を設定するだけです。
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
Crontabファイルの設定に間違いが1つあります。以下の構成では、sh
プレフィックスを使用してシェルプロンプトと同じようにbackup.sh
を呼び出していますが、これはcronでは機能しない可能性があります。
#Automatic MySQL backup
30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh
chmod a + x <ファイル名>
これを反映するようにcrontabを更新します。 (ファイルを直接呼び出すと、ファイル内のシェバン行ごとにシェルが使用されます)
#Automatic MySQL backup
30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh
これが役立つことを願っています。