Bash 脚本手动运行,但在 crontab 上失败 [英] Bash script runs manually, but fails on crontab
问题描述
我是 shell 脚本的新手.我写了一个shell脚本来做MySQL数据库的增量备份.脚本是可执行格式的,手动执行时运行成功,但通过crontab执行时失败.
I'm a newbie to shell scripting. I have written a shell script to do incremental backup of MySQL database.The script is in executable format and runs successfully when executed manually but fails when executed through crontab.
Crontab 入口是这样的:
Crontab entry is like this :
*/1 * * * * /home/db-backup/mysqlbackup.sh
下面是shell脚本代码-
Below is the shell script code -
#!/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 时,我得到了这个
When I did $echo PATH, I got this
/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
推荐答案
问题可能是您的 $PATH 在手动环境中与 crontab 运行的环境不同.因此, which
找不到您的可执行文件.要解决此问题,请首先在手动环境 (echo $PATH
) 中打印您的路径,然后在您在 crontab 中运行的脚本的顶部手动设置 PATH.或者只是通过完整路径引用程序.
The problem is probably that your $PATH is different in the manual environment from that under which crontab runs. Hence, which
can't find your executables. To fix this, first print your path in the manual environment (echo $PATH
), and then manually set up PATH at the top of the script you run in crontab. Or just refer to the programs by their full path.
将其添加到脚本顶部附近,在所有 which
调用之前:
Add this near the top of your script, before all the which
calls:
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"
这篇关于Bash 脚本手动运行,但在 crontab 上失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!