[英]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.