shell 脚本无法在 cron 中正确运行

shell 脚本无法在 cron 中正确运行

我想从 cron 中调用我编写的 shell 脚本。该 shell 脚本使用 Linkchecker 程序。如果我从终端运行该 shell 脚本,它会正常工作。但是,当 cron 运行时,我收到以下错误:

文件“/Users/keith/etc/cron/linkchecker”,第 40 行,来自 linkcheck.director 导入控制台、check_urls、get_aggregate
文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/在里面.py", 第 25 行,来自 . 导入聚合器、控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py”, 第 25 行,来自 . 导入记录器、状态、检查器、清理文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py”, 第 20 行,来自 . 导入任务文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py”, 第 20 行,来自 . 导入控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py”, 第 27 行,来自 stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") 文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py”,第 930 行,在 getwriter 中返回 lookup(encoding).streamwriter LookupError:未知编码:回溯(最近一次调用最后一次):
文件“/Users/keith/etc/cron/linkchecker”,第 40 行,来自 linkcheck.director 导入控制台、check_urls、get_aggregate
文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/在里面.py", 第 25 行,来自 . 导入聚合器、控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py”, 第 25 行,来自 . 导入记录器、状态、检查器、清理文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py”, 第 20 行,来自 . 导入任务文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py”, 第 20 行,来自 . 导入控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py”, 第 27 行,来自 stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") 文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py”,第 930 行,在 getwriter 中返回 lookup(encoding).streamwriter LookupError:未知编码:回溯(最近一次调用最后一次):
文件“/Users/keith/etc/cron/linkchecker”,第 40 行,来自 linkcheck.director 导入控制台、check_urls、get_aggregate
文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/在里面.py", 第 25 行,来自 . 导入聚合器、控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py”, 第 25 行,来自 . 导入记录器、状态、检查器、清理文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py”, 第 20 行,来自 . 导入任务文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py”, 第 20 行,来自 . 导入控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py”, 第 27 行,来自 stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") 文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py”,第 930 行,在 getwriter 中返回 lookup(encoding).streamwriter LookupError:未知编码:回溯(最近一次调用最后一次):
文件“/Users/keith/etc/cron/linkchecker”,第 40 行,来自 linkcheck.director 导入控制台、check_urls、get_aggregate
文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/在里面.py", 第 25 行,来自 . 导入聚合器、控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py”, 第 25 行,来自 . 导入记录器、状态、检查器、清理文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py”, 第 20 行,来自 . 导入任务文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py”, 第 20 行,来自 . 导入控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py”, 第 27 行,来自 stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") 文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py”,第 930 行,在 getwriter 中返回 lookup(encoding).streamwriter LookupError:未知编码:回溯(最近一次调用最后一次):
文件“/Users/keith/etc/cron/linkchecker”,第 40 行,来自 linkcheck.director 导入控制台、check_urls、get_aggregate
文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/在里面.py", 第 25 行,来自 . 导入聚合器、控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py”, 第 25 行,来自 . 导入记录器、状态、检查器、清理文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py”, 第 20 行,来自 . 导入任务文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py”, 第 20 行,来自 . 导入控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py”, 第 27 行,来自 stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") 文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py”,第 930 行,在 getwriter 中返回 lookup(encoding).streamwriter LookupError:未知编码:回溯(最近一次调用最后一次):
文件“/Users/keith/etc/cron/linkchecker”,第 40 行,来自 linkcheck.director 导入控制台、check_urls、get_aggregate
文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/在里面.py", 第 25 行,来自 . 导入聚合器、控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/aggregator.py”, 第 25 行,来自 . 导入记录器、状态、检查器、清理文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/status.py”, 第 20 行,来自 . 导入任务文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/task.py”, 第 20 行,来自 . 导入控制台文件“/opt/local/lib/python2.5/site-packages/linkcheck/director/console.py”, 第 27 行,来自 stderr = codecs.getwriter(i18n.default_encoding)(sys.stderr, errors="ignore") 文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py”,第 930 行,在 getwriter 中返回 lookup(encoding).streamwriter LookupError:未知编码:

我已将 linkchecker 文件 chmod 777。我已将 linkchecker 文件移至当前主目录。我通过以下方式添加了 cron

crontab -e

我输入

38       12      *       *       5      /Users/keith/etc/cron/linkchecker.sh

我的 shell 脚本的第一行是 #!/bin/sh

所以我唯一能想到的就是我在 cron 运行时缺少一些环境变量。当我在脚本顶部添加 env 并比较 cron 运行时和终端中的变量时,发现存在差异。根据https://stackoverflow.com/questions/1694942/environment-variable-used-in-shell-script-appear-blank-in-log-file-when-run-by-cr我可以添加 . /etc/profile,这样就可以输入正确的环境变量。这似乎没有吸收变量,因为当我使用 env 时变量仍然相同。

我在 Mac 上,不知道这有什么区别。此外,我在脚本顶部粘贴了工作变量,当我从终端运行时,这些变量有效,但 cron 仍然无效。

答案1

您如何获得回溯?您发布的 cron 条目似乎没有将输出重定向到文件。

您在交互运行脚本时使用的 Python 版本不同吗?如果您使用的是 MacPorts 等,并且那里的 Python 版本比 OS X 安装的版本更新,则可能会发生这种情况。如果该回溯来自您的 cron 作业,则它似乎正在运行 2.5。这是您在交互输入时最终得到的结果吗python

你能给我们看一下剧本吗?

相关内容