可能重复:
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
尝试这个
38 12 * * 5 /bin/bash -l -c /Users/keith/etc/cron/linkchecker.sh
该-l
选项将获取用于执行脚本的登录环境。