我是壳牌脚本的新手。我编写了一个shell脚本来执行MySQL的增量备份,database.The脚本是可执行格式的,手动执行时运行成功,但在通过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当我做$echo路径时,我得到了这个
/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-30 19:54:48
问题可能是您的$PATH在手动环境中与运行crontab的环境不同。因此,which无法找到您的可执行文件。要解决这个问题,首先在手动环境(echo $PATH)中打印路径,然后在crontab中运行的脚本顶部手动设置路径。或者直接引用程序的全部路径。
编辑:在所有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-02-01 21:10:20
另一种更通用的方法是让cron运行用户的bash登录进程。除了路径之外,这还将获取任何LD_LIBRARY_PATH、LANG设置、其他环境变量等。为此,编写crontab条目如下:
34 12 * * * bash -l /home/db-backup/mysqlbackup.sh发布于 2016-07-29 03:56:10
我的问题是,我在/etc/cron.d (Centos 7)中设置了cron作业。在这样做时,我似乎需要指定执行脚本的用户,这与在用户级别输入cron作业时不同。
我所要做的就是
*/1 * * * * root perl /path/to/my/script.sh
*/5 * * * * root php /path/to/my/script.php其中" root“声明我将脚本作为root运行。还需要确保在文件顶部定义了以下内容。你的道路可能不一样。如果您不确定,请尝试命令“哪个perl",”哪个php“。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/binhttps://stackoverflow.com/questions/14612444
复制相似问题