我编写了一小段代码来检查 aws cli 版本
#!/bin/bash
if [ -e "/usr/local/bin/aws" ];
then
myAWS="/usr/local/bin/aws"
else
myAWS="/usr/bin/aws"
fi
myCmd=("${myAWS} --version")
echo "$myCmd"
message=$($myCmd)
echo "$message"
现在,当我以 root 用户身份手动运行此程序时,我可以运行,但在通过 crontab 运行此程序时,我们的 aws cli 升级之后
57 21 * * * /rough/scripts/log/test.sh > /rough/scripts/log/test.log 2>&1
我遇到以下错误,您能建议一下吗,我已经重新安装了 aws cli,但没有效果。
/usr/local/bin/aws --version
Traceback (most recent call last):
File "aws", line 19, in <module>
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
File "awscli/clidriver.py", line 43, in <module>
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
File "awscli/help.py", line 20, in <module>
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
File "docutils/core.py", line 23, in <module>
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
File "docutils/io.py", line 43, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 4-6: surrogates not allowed
[24036] Failed to execute script 'aws' due to unhandled exception!
答案1
Cron 有自己的PATH
这是源代码中的硬编码。这意味着 cron 命令将在不同的环境中运行。我猜你的用户(或 root)python
在他们的 中配置了不同的环境PATH
。或者你在登录时激活了 python 环境,或者安装了一些pip
软件包。无论是哪种情况,你都需要在你的 中重现它cron
。
首先,echo "$PATH"
以该命令适用的用户身份登录后运行。然后,获取PATH
打印结果并将其添加到 crontab 的开头:
PATH="blah;blah;blah"
57 21 * * * /rough/scripts/log/test.sh > /rough/scripts/log/test.log 2>&1
如果这不起作用,您可以尝试使用以下命令加载用户的 shell 配置文件bash -i
:
-i If the -i option is present, the shell is interactive.
这将强制bash
以“交互”模式运行,这意味着它将读取调用用户的~/.bashrc
文件(参见https://askubuntu.com/a/438170/85695):
57 21 * * * bash -i /rough/scripts/log/test.sh > /rough/scripts/log/test.log 2>&1
如果这仍然不起作用,您需要确切地弄清楚您使用的 python 设置以及它的来源,然后尝试在 crontab 中重现它。如果您编辑问题并提供有关您的设置的更多详细信息,我们可能会提供帮助。
顺便提一下,您可以稍微简化一下脚本。首先,由于和都/usr/local/bin
处于/usr/bin
默认状态PATH
,如果您的目标if
是找出两者中哪一个包含aws
可执行文件,那么您根本不需要if
,只需运行即可aws
。
相反,如果您希望始终优先考虑 中的版本,/usr/local/bin
即使 中有另一个版本/usr/bin
,那么 就if
很有意义。
message=$(command); echo $message
接下来,运行: 如果command
打印出您想要看到的内容,则直接运行它就没什么意义了。我会像这样编写您的脚本:
#!/bin/bash
myAws=/usr/bin/aws
[ -e /usr/local/bin/aws ] && myAws=/usr/local/bin/aws
myCmd=("$myAWS" "--version")
echo "${myCmd[@]}"
"${myCmd[@]}"
或者,如果你只是想跑步一个 aws
并且if
只是为了弄清楚它安装在哪里,并且您还想查看它的完整路径,只需:
#!/bin/bash
myAws=$(which aws)
myCmd=("$myAws" "--version")
echo "${myCmd[@]}"
"${myCmd[@]}"