19

私はシェルスクリプトの初心者です。MySQLデータベースの増分バックアップを実行するシェルスクリプトを作成しました。スクリプトは実行可能形式であり、手動で実行すると正常に実行されますが、crontabを介して実行すると失敗します。

Crontabのエントリは次のようになります。

*/1 * * * * /home/db-backup/mysqlbackup.sh

以下はシェルスクリプトコードです-

#!/bin/sh
MyUSER="root"       # USERNAME
MyPASS="password"         # PASSWORD
MyHOST="localhost"  # Hostname
Password="" #Linux Password

MYSQL="$(which mysql)"
if [ -z "$MYSQL" ]; then
echo "Error: MYSQL not found"
exit 1
fi
MYSQLADMIN="$(which mysqladmin)"
if [ -z "$MYSQLADMIN" ]; then
    echo "Error: MYSQLADMIN not found"
    exit 1
fi
CHOWN="$(which chown)"
if [ -z "$CHOWN" ]; then
    echo "Error: CHOWN not found"
    exit 1
fi
CHMOD="$(which chmod)"
if [ -z "$CHMOD" ]; then
    echo "Error: CHMOD not found"
    exit 1
fi

GZIP="$(which gzip)"
if [ -z "$GZIP" ]; then
    echo "Error: GZIP not found"
    exit 1
fi
CP="$(which cp)"
if [ -z "$CP" ]; then
    echo "Error: CP not found"
    exit 1
fi
MV="$(which mv)"
if [ -z "$MV" ]; then
    echo "Error: MV not found"
    exit 1
fi
RM="$(which rm)"
if [ -z "$RM" ]; then
    echo "Error: RM not found"
    exit 1
fi
RSYNC="$(which rsync)"
if [ -z "$RSYNC" ]; then
    echo "Error: RSYNC not found"
    exit 1
fi

MYSQLBINLOG="$(which mysqlbinlog)"
if [ -z "$MYSQLBINLOG" ]; then
    echo "Error: MYSQLBINLOG not found"
    exit 1
fi
# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y-%T")"

DEST="/home/db-backup"
mkdir $DEST/Increment_backup.$NOW
LATEST=$DEST/Increment_backup.$NOW
$MYSQLADMIN -u$MyUSER -p$MyPASS flush-logs
newestlog=`ls -d /usr/local/mysql/data/mysql-bin.?????? | sed 's/^.*\.//' | sort -g | tail -n 1`
echo $newestlog
for file in `ls /usr/local/mysql/data/mysql-bin.??????`
do
        if [ "/usr/local/mysql/data/mysql-bin.$newestlog" != "$file" ]; then
     echo $file             
     $CP "$file" $LATEST         
        fi
done
for file1 in `ls $LATEST/mysql-bin.??????`
do
 $MYSQLBINLOG $file1>$file1.$NOW.sql 
 $GZIP -9 "$file1.$NOW.sql"     
 $RM "$file1"
done
$RSYNC -avz $LATEST /home/rsync-back
  • まず第一に、crontabでスケジュールされた場合、エラーは表示されません。スクリプトが実行されているかどうかを知るにはどうすればよいですか?
  • 次に、crontabでシェルスクリプトを実行する正しい方法は何ですか。一部のブログは、環境変数の変更を提案しています。最善の解決策は何でしょうか

$ echo PATHを実行したときに、これを取得しました

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/mysql/bin:/opt/android-sdk-linux/tools:/opt/android-sdk-linux/platform-tools:~/usr/lib/jvm/jdk-6/bin
4

5 に答える 5

23

問題はおそらく、手動環境と crontab が実行される環境では $PATH が異なることです。したがって、which実行可能ファイルが見つかりません。これを修正するには、まず手動環境 ( echo $PATH) でパスを出力してから、crontab で実行するスクリプトの先頭に手動で PATH を設定します。または、プログラムを完全なパスで参照するだけです。

which編集:すべての呼び出しの前に、スクリプトの上部近くにこれを追加します。

export PATH="/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/mysql/bin:/opt/android-sdk-linux/tools:/opt/android-sdk-linux/platform-tools:~/usr/lib/jvm/jdk-6/bin"
于 2013-01-30T19:54:48.397 に答える
13

もう1つの一般的な方法は、cronにユーザーのbashログオンプロセスを実行させることです。PATHに加えて、これはLD_LIBRARY_PATH、LANG設定、その他の環境変数なども取得します。これを行うには、次のようにcrontabエントリをコーディングします。

34  12  * * *   bash -l /home/db-backup/mysqlbackup.sh
于 2013-02-01T21:10:20.440 に答える
5

私の問題は、/etc/cron.d (Centos 7) で cron ジョブを設定したことです。その際、ユーザーレベルでcronジョブを入力する場合とは異なり、スクリプトを実行するユーザーを指定する必要があるようです。

私がしなければならなかったのは

*/1 * * * * root perl /path/to/my/script.sh
*/5 * * * * root php /path/to/my/script.php

「ルート」は、ルートとしてスクリプトを実行していることを示しています。また、ファイルの先頭で以下が定義されていることを確認する必要があります。あなたのパスは異なる場合があります。よくわからない場合は、「which perl」、「which php」というコマンドを試してください。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
于 2016-07-29T03:56:10.177 に答える
0

スクリプトの冒頭でユーザー プロファイルをインポートするだけです。

すなわち:

. /home/user/.profile
于 2013-07-16T15:25:29.913 に答える