【发布时间】:2014-08-06 18:40:03
【问题描述】:
已解决!在我所有脚本的顶部添加 #!/bin/bash 以使用 bash 扩展。否则,它将自身限制为 POSIX shell 语法。谢谢巴尔玛!
另外,我要补充一点,在执行 gpg 解密后,我遇到了无法从 cronjob 进行解密的问题,答案是在 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 > (decrypt, unzip)
这里是 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"
解密.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
注意,我不知道这些变量是否适合我的安装或脚本。我只是将它们从其他帖子中删除并尝试无济于事。如果这些不是正确的环境变量,有人可以告诉我如何为我的特定应用程序推断出正确的环境变量吗?
【问题讨论】:
-
感谢您提供您尝试调试的步骤! The crontab tag wiki 有更多,你能检查一下吗?
-
“它不起作用”是什么意思?默认情况下,cron 会将作业的输出通过电子邮件发送给拥有 crontab 的用户。但是,电子邮件在 *NIX 盒子上“默认”不起作用,因此电子邮件最终只是在以太网中,而不是传递。我会: 1. 在每个脚本的顶部添加一个“set -x”以显示正在执行的内容,以及 2. 将每个脚本的 stdout 和 stderr 输出重定向到文件,以便您可以检查它们:“scriptname=
basename $0; exec >/tmp/$scriptname.stdout 2>/tmp/$scriptname.stderr" -
这些听起来像是有用的调试技巧。多谢你们!那么脚本顶部的“set -x”输出脚本的filePath?我不明白 "scriptname=basename" $0;但我想我理解其余的。
标签: linux bash shell ubuntu cron