linux下sh脚本可以执行,但是放到crontab中执行无信息(crontab PATH信息与当前用户信息不一致)

发布时间 2023-04-27 16:45:41作者: 亲爱的焦糖玛奇朵

创建Mysql备份脚本后,将sh文件加入crontab,命令未执行,日志信息未读取到Mysql库信息

#!/bin/bash
DATE=$(date +%F_%H)
HOST=127.0.0.1
USER=root
PASS=123123
BACKUP_DIR=/root/tmp/
DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |grep "mysql")
echo "今天"$DATE"涉及到的库是:"
echo ${DB_LIST}
echo '------备份的数据库-----------'
echo ${DB_LIST}
for DB in ${DB_LIST}; do
    BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql.gz
    if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB | gzip > $BACKUP_NAME 2>/dev/null; then
        echo "$BACKUP_NAME 备份失败!"
    fi
done
echo '------备份成功-----------'
find $BACKUP_DIR  -mtime +3 -type f | xargs rm -f

后根据mail信息输出,查看到如下报错信息:

单独sh文件,就可以。

突然想到是不是crontab的path环境变量不包含root下的信息,查看如下:

 查看发现,crontab的PATH环境变量确实与root环境变量调用不一致,后修改脚本,在执行前,应用当前用户环境变量,备份完成。

脚本如下:

#!/bin/bash
source /root/.bash_profile
DATE=$(date +%F_%H)
HOST=127.0.0.1
USER=root
PASS=123123
BACKUP_DIR=/root/tmp/
DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |grep "mysql")
echo "今天"$DATE"涉及到的库是:"
echo ${DB_LIST}
echo '------备份的数据库-----------'
echo ${DB_LIST}
for DB in ${DB_LIST}; do
    BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql.gz
    if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB | gzip > $BACKUP_NAME 2>/dev/null; then
        echo "$BACKUP_NAME 备份失败!"
    fi
done
echo '------备份成功-----------'
find $BACKUP_DIR  -mtime +3 -type f | xargs rm -f