gpt4 book ai didi

python - 通过 cron 调用时,MQTT Python 无法启动 Bash 脚本

转载 作者:太空宇宙 更新时间:2023-11-04 10:25:06 25 4
gpt4 key购买 nike

好吧,在过去的几周里,这让我发疯了,我不知道发生了什么,所以我希望能征求你们的意见,看看是否有更聪明的人能弄清楚发生了什么,或者至少让我走上正轨,弄清楚发生了什么。

我有 200 个奇怪的 ARM 设备(Raspberry Pi 3's)运行客户端脚本(Python v2.7)连接到 1 个 ARM 设备,我所谓的服务器,运行 MQTT(v3.1.1)。

因为经常会添加很多调整和新功能,所以我继续创建了一个“更新”功能。

本质上,它的工作原理如下:

  1. Client connect to MQTT ->
  2. Client sends running client script version ->
  3. Server responds if update is available with a link to a .tar.gz file ->
  4. Client downloads .tar.gz file and unpacks it.
  5. Client runs standard bash script 'update.sh' in unpacked folder.

此 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 日志文件似乎根本没有启动。

我们将不胜感激任何帮助!

最佳答案

这里有几个可能的区别。举几个特别有可能的例子:

  • cron 公开的环境可能缺少由用户登录脚本建立的变量,这些变量是手头脚本成功运行所必需的。

    比较工作和非工作情况之间的 os.environ 可能会提供信息。

  • 您的 sudo 命令可能需要 TTY。

    捕获命令的 stderr,并在出错时检查它,在这里可能会有帮助。使用 set -x shell 选项,如下所示,通过捕获 shell 调用的确切命令(如果事实上 sudo 成功执行您的shell;如果您的 /etc/sudoers 需要 TTY,则可能不需要。

    cmd = ['sudo', 'sh', '-x', '/update/update.sh']
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (output, err) = p.communicate()
    if p.returncode != 0:
    # TODO: LOG THE CONTENTS OF err SOMEWHERE YOU CAN REVIEW THEM!
    raise subprocess.CalledProcessError(p.returncode, err)

关于python - 通过 cron 调用时,MQTT Python 无法启动 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41967423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com