在 Ubuntu 上自动启动 python 脚本

Autostarting a python script on Ubuntu

这似乎出现了好几次,但我已经完成了所有答案并尝试了所有我能找到的方法,但我仍然无法在启动时将 Python 脚本获取到 运行在我的 Kubuntu 18.04 系统上。

我有一个为家庭自动化项目设置数据记录器的项目。这是一个 ESP32 板 运行ning Micropython,它通过 WiFi 发送回 MQTT 消息以保存在计算机上。我已经设法让它全部正常工作,我现在只需要在计算机上启动一个 Python 脚本 运行ning 来获取 MQTT 消息。我可以从终端 运行 它并且它工作得很好。我认为让它在启动时自动 运行 是微不足道的,所以我不必每次打开计算机时都输入它,但我已经花了几个小时,但它仍然不会做它!我尝试过的事情:

  1. 使用系统设置中的自动启动 GUI 运行 命令 python /home/rosebank/datalogger/datalogger_server.py
  2. 编写仅包含命令 python /home/rosebank/datalogger/datalogger_server.py 的 .sh 文件,使其可执行并使用自动启动 GUI 运行 该脚本文件
  3. 按照以下说明在 ~/.config/autostart 文件夹中创建 .desktop 文件:https://whosebug.com/questions/...05612#25805612 使用 Python 命令
  4. 同上但运行使用 .sh 脚本文件
  5. 正在将上面的 .desktop 文件复制到 /etc/xdg/autostart
  6. 在 X-GNOME-Autostart-Delay 上设置 60 秒延迟,以防 MQTT 代理尚未 运行ning
  7. 正在创建一个 .conf 文件并放入 etc/init
  8. 正在将 .py 文件复制到 /bin 并将“@reboot python /bin/datalogger_server.py &”添加到 crontab 文件的底部

从字面上看,我尝试的任何事情都无法制作此脚本 运行!!我只是不明白这有多么困难,正如我所说的,我需要做的就是在启动后在终端中输入命令并且它可以工作,那么为什么我不能让它自动工作呢?! 我不知道发生了什么。代码根本就不是 运行ning 吗?它是否试图 运行 并给出错误信息?是否有任何地方可以找到它生成的任何错误消息?正如我所说,代码仅从终端 运行 就可以正常工作,所以我不明白为什么它不能在启动时工作。

编辑:澄清一下,在这台计算机上,它会在开机时自动登录,唯一的 'user' 是 rosebank。所以在登录时而不是在启动时让它 运行 完全没问题。由用户而不是 root 拥有它 运行 也很好,因为它只需要能够写入用户的主文件夹并且不需要(可能不应该有)任何特殊权限。我真的只是在寻找一种自动方式来完成与我在终端中键入命令时所发生的完全相同的事情。

我在 运行 PyPI 本地服务器时遇到了同样的问题。 我开发了一个本地 PyPI 服务器,它应该是 运行 使用 hostingpypi runserver --port PORT --host HOST 命令。

因此,从 https://pypi.org/project/pypiserver/#running-as-a-systemd-service 借用了 systemd 配置文件,并在 Ubuntu 启动时将其用于 运行 宁我的脚本。

好的,在 Yunbo Sim 的大力帮助下,我终于解决了这个问题。对于任何试图做类似事情而不必阅读完整线程的人来说,有效的总结是:

让我绊倒的事情:

  • ExecStart 需要指向一个实际的命令,然后是您尝试 运行 的脚本,而不仅仅是指向脚本,例如指向 运行 您需要的主文件夹中的 bash 脚本 /bin/bash '~/script.sh' 不只是 ~/script.sh; 或者 运行 你需要一个 Python 脚本: /usr/bin/python '~/python_script.py' 不只是 python ~/python_script.py

  • 不知道您必须 运行 systemctl enable 命令才能在启动时实际将其设置为 运行(在我这样做之前它会 运行 当我启动它但不是自动启动时)

  • 需要将其设置为 After=mosquitto.service 因为我的代码依赖于 Mosquitto 运行ning.

另一件让我感到困惑的事情是我安装了一个 Python 版本作为 Anaconda 的一部分并且用来编写我所有的代码,其中与系统范围安装不同那是 运行 来自不包含脚本所需的所有模块的服务。要解决这个问题,要么将 ExecStart 命令指向您希望它使用的 Python 版本的二进制文件的绝对路径,要么确保系统范围的版本安装了正确的模块。