bash脚本手动运行,但未能上的crontab(Bash script runs manually,

2019-07-19 00:54发布

我对shell脚本一个新手。 我写了一个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
  • 首先,关于crontab的计划时,它没有显示任何错误。 我怎样才能知道脚本是否正在运行或不?
  • 其次,什么是一个crontab执行shell脚本的正确方法。 一些博客建议在环境变量的变化。 什么是最好的解决办法

当我做$回声路径中,我得到这个

/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

Answer 1:

这个问题可能是你的$ PATH是从人工环境的crontab在其下运行不同。 因此, which无法找到你的可执行文件。 为了解决这个问题,首先打印在手动环境路径( echo $PATH ),然后手动设置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"


Answer 2:

另一种更通用的方法是有cron运行用户的bash的登录过程。 除了PATH,这也将拿起任何LD_LIBRARY_PATH,LANG设置其他环境变量等。要做到这一点,你的代码crontab条目,如:

34  12  * * *   bash -l /home/db-backup/mysqlbackup.sh


Answer 3:

我的问题是,我设置/etc/cron.d中的cron作业(Centos的7)。 看来,这样做的时候,我需要指定谁执行脚本,当在用户级别进入一个cronjob不同用户。

我所要做的就是

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

其中“根”指出,我运行脚本作为根。 还需要确保在文件的顶部定义如下。 您的路径可能会有所不同。 如果你不知道尝试“这perl的”,“它的PHP”的命令。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin


Answer 4:

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

即:

. /home/user/.profile


文章来源: Bash script runs manually, but fails on crontab
标签: bash shell cron