19

我是 shell 脚本的新手。我编写了一个shell脚本来对MySQL数据库进行增量备份。该脚本是可执行格式,手动执行时运行成功,但通过crontab执行时失败。

crontab 条目是这样的:

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

下面是shell脚本代码 -

#!/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 中执行 shell 脚本的正确方法是什么。一些博客建议更改环境变量。什么是最好的解决方案

当我做 $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

问题可能是您在手动环境中的 $PATH 与运行 crontab 的环境不同。因此,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

另一种更通用的方法是让 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 作业。似乎这样做时我需要指定执行脚本的用户,这与在用户级别输入 cronjob 不同。

我所要做的就是

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

其中“root”表示我以 root 身份运行脚本。还需要确保在文件顶部定义了以下内容。你的路径可能不同。如果您不确定,请尝试命令“which perl”、“which php”。

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

只需在脚本开头导入您的用户配置文件。

IE:

. /home/user/.profile
于 2013-07-16T15:25:29.913 回答
0
  1. 在您的 crontab 文件中,您的脚本条目可以有

    * * * * * /bin/bash /path/to/your/script
    
  2. 确保在脚本中使用完整路径。我看过它,但我没有看到任何东西,但以防万一我错过了。

于 2020-06-29T14:33:04.817 回答