繁体   English   中英

crontab不执行复杂的bash脚本

[英]crontab not executing complex bash script


解决了! 在我所有脚本的顶部添加#!/ bin / bash以便使用bash扩展名。 否则,它将自身限制为POSIX Shell语法。 谢谢巴尔玛!

另外,我还要补充一点,就是我执行完cronjob后无法通过cronjob进行gpg解密,并且答案是在gpg命令中添加--no-tty选项(无终端输出)。


我是Linux的新手,所以请耐心等待...

以ubuntu身份登录时,我可以使用crontab -e执行一个简单的脚本:

* * * * * /ngage/extract/bin/echoer.sh

这个bash脚本只是将输出打印到文件中:

echo "Hello" >> output.txt

但是,当我尝试以完全相同的方式执行更复杂的bash脚本时,它不起作用:

* * * * * /ngage/extract/bin/superMasterExtract.sh

该脚本调用了其他bash脚本。 共有4个脚本,其中3个层次结构。 它进入superMasterExtract> masterExtract>(解密,解压缩)

这是superMasterExtract.sh(顶层)的代码:

shopt -s nullglob      # ignore empty file
cd /str/ftp            
DIRECTORY='writeable'
for d in */ ; do         # for all directories in /str/ftp
if [ -d "$d$DIRECTORY" ]; then   # if the directory contains a folder called 'writeable'
files=($d$DIRECTORY/*)
dirs=($d$DIRECTORY/*/)
numdirs=${#dirs[@]}
numFiles=${#files[@]}
((numFiles-=$numdirs))
if [ $numFiles -gt 0 ]; then       # if the folder has at least one file in it
bash /ngage/extract/bin/masterExtract.sh /str/ftp ${d:0:${#d} - 1}   # execute this     masterExtract bash script with two parameters passed in
fi
fi
done

masterExtract.sh:

DATE="$(date +"%m-%d-%Y_%T")"
LOG_FILENAME="log$DATE"
LOG_FILEPATH="/ngage/extract/logs/$2/$LOG_FILENAME"
echo "Log file is $LOG_FILEPATH"
bash /ngage/extract/bin/decrypt.sh $1 $2 $DATE
java -jar /ngage/extract/bin/sftp.jar $1 $2
bash /ngage/extract/bin/unzip.sh $1 $2 $DATE
java -jar /ngage/extract/bin/sftp.jar $1 $2
echo "Log file is $LOG_FILEPATH"

crypto.sh:

shopt -s nullglob
UPLOAD_FILEPATH="$1/$2/writeable"
DECRYPT_FOLDER="$1/decryptedFiles/$2"
HISTORY_FOLDER="$1/encryptHistory/$2"
DONE_FOLDER="$1/doneFiles/$2"
LOG_FILENAME="log$3"
LOG_FILEPATH="/ngage/extract/logs/$2/$LOG_FILENAME"
echo "DECRYPT_FOLDER=$DECRYPT_FOLDER" >> $LOG_FILEPATH
echo "HISTORY_FOLDER=$HISTORY_FOLDER" >> $LOG_FILEPATH
cd $UPLOAD_FILEPATH
for FILE in *.gpg;
do
    FILENAME=${FILE%.gpg}

    echo ".done FILE NAME=$UPLOAD_FILEPATH/$FILENAME.done" >> $LOG_FILEPATH

    if [[ -f $FILENAME.done ]]; then
        echo "DECRYPTING FILE=$UPLOAD_FILEPATH/$FILE INTO $DECRYPT_FOLDER/$FILENAME" >> $LOG_FILEPATH

        cat /ngage/extract/.sftpPasswd | gpg --passphrase-fd 0 --output "$DECRYPT_FOLDER/$FILENAME" --decrypt "$FILE"
        mv $FILE $HISTORY_FOLDER/$FILE

        echo "MOVING FILE=$UPLOAD_FILEPATH/$FILE INTO $HISTORY_FOLDER/$FILE" >> $LOG_FILEPATH
    else
        echo "Done file not found!" >> $LOG_FILEPATH
    fi 

done


cd $DECRYPT_FOLDER
for FILE in *
do
    mv $FILE $DONE_FOLDER/$FILE
    echo "DECRYPTED FILE=$DONE_FOLDER/$FILE" >> $LOG_FILEPATH
done

如果有人知道为什么它拒绝执行我更复杂的脚本,我很想听听它。 我还尝试在crontab的开头设置一些环境变量:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/local/bin:/usr/bin
MAILTO=jgardnerx85@gmail.com
HOME=/
* * * * * /ngage/extract/bin/superMasterExtract.sh

注意,我不知道这些是我的安装或脚本的适当变量。 我只是把他们从其他职位上拉下来,并尝试无济于事。 如果这些不是正确的环境变量,有人可以告诉我如何为我的特定应用程序推断出正确的环境变量吗?

您需要以以下内容开始脚本

#!/bin/bash

为了利用bash扩展。 否则,它将自身限制为POSIX Shell语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM