我有一个运行 python 的 shell 脚本,然后通过 mutt 将 pdf 附加到电子邮件。
Shell 脚本:
cd ./pod_reports/script/
whereareyou=`pwd`
OUT=`python3 dummy.py`
cd ..
filename=$(ls *.pdf -1t | head -1)
strt="echo Did we get python? "
mailmutt="| mutt -s 'Subject Line' -a $filename -- [email protected]"
stmt="$strt$whereareyou$OUT$mailmutt"
echo $stmt
eval $stmt
Python 脚本,dummy.py
import sys
OUT = sys.stdout.write(" I did python!! ")
sys.exit(0)
当 shell 脚本直接从命令行运行时,我通过“wherareyou”和电子邮件正文中的“我做了 python!!”语句获得预期的 pwd,以及预期的附件。当脚本通过 crontab 安排时,我得到了相同的预期“whereareyou”和附件,但我没有收到来自 python 的消息。我的理解是,当 shell 由 crontab 执行时,python 根本没有运行。
我不明白为什么。这是否是 crontab 的预期行为?如果是这样,那么如果不在 shell 中,如何安排一系列脚本?
答案1
答案:crontab 可能与您的命令行有不同的程序路径。
碰巧的是,在我们的系统中,“mutt”(电子邮件)程序存储在/usr/bin/并且无论使用哪种机制运行 crontab,此路径都是已知的,因此它能够成功发送电子邮件。但是,我想在此 shell 中运行的许多程序(包括 python3)都位于不同的目录中:/usr/本地/bin/。crontab 无法识别此本地文件夹中的程序(实际上,即使在 crontab 安排的 shell 中运行 which python3 也不会返回任何内容)。尽管当我从命令行运行 shell 时 mutt 和 python3 都可以正常工作,但情况仍然如此。
解决方案是运行程式感兴趣的(在我的例子中是 python3)来自它们的绝对路径:
cd ./pod_reports/script/
whereareyou=`pwd`
OUT=`/usr/local/bin/python3 dummy.py`
cd ..
filename=$(ls *.pdf -1t | head -1)
strt="echo Did we get python? "
mailmutt="| mutt -s 'Subject Line' -a $filename -- [email protected]"
stmt="$strt$whereareyou$OUT$mailmutt"
echo $stmt
eval $stmt