【发布时间】:2017-01-31 21:01:03
【问题描述】:
好的,过去几周这一直让我发疯,我不知道发生了什么事,所以我希望能全神贯注,看看是否有更聪明的人能弄清楚发生了什么,或者至少让我走上正轨,弄清楚发生了什么。
我有 200 多台 ARM 设备(Raspberry Pi 3)运行客户端脚本 (Python v2.7),连接到 1 台 ARM 设备,即我所谓的服务器,运行 MQTT (v3.1.1)。
因为经常会添加很多调整和新功能,所以我继续创建了一个“更新”功能。
基本上,它的工作原理如下:
- 客户端连接到 MQTT ->
- 客户端发送运行客户端脚本版本->
- 如果更新可用,服务器会响应 .tar.gz 文件的链接 ->
- 客户端下载 .tar.gz 文件并解压。
- 客户端在解压后的文件夹中运行标准 bash 脚本“update.sh”。
此 bash 文件包含新命令,例如“apt-get update”或新软件包和新脚本(取决于需要安装的内容。)
通过向特定主题发送有效负载(例如带有链接的“更新/[设备名称]”)来强制客户端进行更新。设备订阅了该主题,并在获得此有效负载时下载并运行该文件。
现在这是绝对奇怪的部分!
效果很好!
你说的很完美,那你为什么需要帮助?
嗯,当我通过 SSH 运行脚本时,它仅完美运行。 如果我在启动时运行脚本,除了更新之外一切正常。似乎更新了味精,似乎获取了文件并解压,但运行 bash 脚本似乎失败。
目前,Python 使用以下命令运行 bash 脚本:
call(["sudo", "sh", "/update/update.sh"])
如果我不得不猜测:
它没有运行 bash 脚本。我不确定为什么。正如我之前提到的,当我通过 SSH 运行它时它运行良好,不知何故,当 crontab 在重新启动时运行它时,它不会被调用。
它确实拥有所有特权,据我所知,不是这样。
我试过了:
嗯,我能想到的几乎都是!不同的调用方法,从 subprocess.call 到 os.call,似乎没有任何效果。我还在 sudoers 下添加了用户,我还尝试记录 Python 和 Bash 脚本的输出。 Python 没有显示任何错误,而且 Bash 日志文件似乎根本没有启动。
我们将不胜感激!
【问题讨论】:
-
你可以试试
shell=True -
@Jean-FrançoisFabre,请不要在没有令人信服的理由的情况下提出增加更多复杂性和额外故障点的建议。
-
这只是一个评论,而不是一个答案。如果它不起作用,那就太糟糕了。
-
...所以,cron 的环境和典型的用户环境有很大的不同。首先要检查这些差异。
-
例如,如果脚本依赖于
/usr/local/bin中的内容,而用于cron 的PATH是/bin:/usr/bin,那么你就是。
标签: python linux bash shell ssh