How To Autorun A 蟒蛇 Script On Boot Using 系统的

49

在最新版本的Raspbian中,我开始努力使用Cron或rc.local在启动时自动运行Python脚本。似乎Raspbian引导顺序已更改,并且这些过程在该顺序的不同点运行。这有多少问题取决于您的Python脚本正在尝试执行的操作以及所需的资源。

如果您的脚本依赖于该时间点可用的任何系统功能,那么在启动顺序中运行Python脚本的时间至关重要。对我而言,这通常包括:

  • 网络已连接且可用
  • / home / pi目录已挂载并读取以供使用
  • NTP已更新系统时间

我决定用“systemd” as this seems to the recommended way of launching custom features and lots of 的Linux distributions are adopting it. 系统的 is a software suite for central management and configuration of a 的Linux system and aims to replace other popular tools that previously fulfilled this role. As a result it seems to have plenty of enemies but you can read all about the controversy 上 the 系统的 Wikipedia page.

系统的 is quite scary. Or easy. Depending 上 your level of experience. My goal was just to get it to launch 上e of my scripts with the minimum of fuss and without having to do too much typing I didn’t understand.

第1步– Your 蟒蛇 Script

我的示例脚本存储在/ home / pi目录中,并命名为“myscript.py”。显然,您的脚本可以称为其他名称,但请注意下面的命令和文本中引用的位置。

第2步– Create A Unit File

Next we will create a configuration file (aka a unit file) that tells 系统的 what we want it to do and when :

sudo nano /lib/systemd/system/myscript.service

在以下文本中添加:

[单元]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle
ExecStart = / usr / bin / 蟒蛇 /home/pi/myscript.py

[Install]
WantedBy=multi-user.target

您可以使用[CTRL-X],[Y]和[ENTER]保存并退出Nano编辑器。

这定义了一个名为“My Script Service”并且我们要求在多用户环境可用时启动它。的“ExecStart”参数用于指定我们要运行的命令。的“Type” is set to “idle”确保仅在其他所有内容加载后才运行ExecStart命令。对于基于GPIO的脚本,默认类型为“simple” didn’t work.

请注意,路径是绝对的,并且完全定义了Python的位置以及我们的Python脚本的位置。

为了存储脚本’日志文件中的文本输出,可以将ExecStart行更改为:

ExecStart = / usr / bin / 蟒蛇 /home/pi/myscript.py>/home/pi/myscript.log 2>&1

单位文件上的权限需要设置为644:

须藤chmod 644 /lib/systemd/system/myscript.service

第三步– Configure 系统的

Now the unit file has been defined we can tell 系统的 to start it during the boot sequence :

sudo systemctl守护程序重新加载
 

重新启动Pi,您的自定义服务应运行:

sudo reboot

步骤4–检查您的服务状态

您可以使用以下方法检查服务状态:

sudo systemctl status 剧本.service

Other useful resources for 系统的

分享。

49条留言

  1. 稍作调整:默认情况下,std out / err定向到journalctl(systemd’替换syslog的组件);但是使用python3脚本时,输出是双缓冲的,这意味着它将赢得’t通常不会出现在日志中(输出会不时刷新,这是不正确的),因此最好使用-u标志启动python3脚本。

  2. 嘿,我’我已经尝试过此方法和其他许多在线方法来自动运行python脚本。我的python脚本记录了一个视频,并使用for循环在指定的时间内保存了多个视频文件。当我使用您的方法(以及其他方法)时,摄像机的LED会打开,就像脚本实际上已在自动运行一样,但此后我找不到任何视频文件!为什么会这样呢?一世’我尝试了很多方法。

  3. I’我一直在努力尝试让我的Sense HAT能够在启动时登录到Google电子表格,这终于帮助了我!非常感谢。

    我发现的一个技巧是,如果您正在读取文件(例如,我使用的是OAuth JSON),那么您还需要在脚本中提供完整路径。在systemctl状态的错误消息中发现此消息,可能对Noah有所帮助。

  4. 伊恩·海洛克

    谢谢你

    花了一天时间尝试使它生效,直到找到本教程。

    其他人似乎缺少

    sudo systemctl守护程序重新加载

    命令,这对于使单元文件实际运行至关重要。

    干杯,伊恩

    • 我发现的大多数教程都包含这一本…
      systemctl enable 剧本.service
      但是他们不’t have this 上e…
      systemctl守护程序重新加载

      我没有的事实’t have ‘systemctl守护程序重新加载’ is most likely why I never got 系统的 to work in 树莓派 Jessie.

      I switched to Arch 的Linux 上 the Raspberry Pi, and I got 系统的 to work fine. In Arch LInux I have never needed to use ‘systemctl守护程序重新加载’.

      背风处

  5. 吉姆·哈里斯(Jim Harris)

    谢谢,这对我(Linux和Pi新手)有很大帮助。

    对于其他新手,让’s note that

    须藤chmod644 /lib/systemd/system/myscript.service

    应该

    须藤chmod 644 /lib/systemd/system/myscript.service

  6. 我有3个想要重新启动的Python程序。可以在启动时使用一个单位文件来启动3个Python程序吗?每个Python程序都需要一个单独的单元文件吗?

  7. 太好了,谢谢。

    现在我的问题。您如何停止脚本?我在无限循环中运行。每隔10分钟,它会在特定时间轴上查找新推文。但是如何停止脚本运行以进行更改?

    • systemctl stop 剧本 service
      systemctl start 剧本 service

      和…在[service]部分中,您可以控制重新启动:
      重新启动=失败|总是
      RestartSec =…
      …配置重新启动服务之前的休眠时间(使用Restart =配置)。接受以秒为单位的无单位值或时间跨度值,例如“5min 20s”. Defaults to 100ms.

    • 该错误消息表示您要么避风港’t created the “myscript.service”文件,或者您使用其他名称,或者在错误的位置创建了文件。采用 :
      cd /lib/systemd/system/my*.service
      检查它是否存在于正确的目录中并被命名“myscript.service”.

  8. 感谢分享!正常工作!但不是日志文件。但是我用过:
    ExecStart = / usr / bin / 蟒蛇 /home/pi/myscript.py>/home/pi/myscript.log 2>1
    注意区别吧’s 2>1 and it’现在登录/ var / log / messages并查看它,只需运行
    journalctl -u 剧本

  9. my 蟒蛇 script imports modules installed using pip . this module is not getting imported when running through 系统的. but when i run the 蟒蛇 script it runs without any problems

  10. 你好,我看不到任何日志文件创建。我怎么看我的输出?即使不添加该日志文件行,它也不会显示在终端中

  11. 谢谢你,我’一个n00b,但尝试学习。当我遇到旧的使用方法时非常困惑’m using Jessie.
    问题,这种方法可以在启动时启动另一个程序吗?我想在后台启动TTYMidi

    ExecStart = / usr / local / bin / ttymidi -s / dev / ttyAMA0 -b 38400 -v&

    I’我已经阅读了有关编辑rc.local的内容,但希望找到‘right’ way 🙂
    瑜伽士

  12. 沃洛迪米尔

    我有一个问题,就像法赞一样–日志文件不起作用。当我只在终端中从ExecStart运行命令时,一切正常,但是如果从systemctl运行,则日志文件不会’t fills.

  13. 嗨,马特,

    一个很好的解释和教程,它很好用。

    删除/修改以使其在启动时停止运行的最佳位是哪一位?我需要花一些时间来写剧本,但是不要’希望旧版本与新版本同时运行。一世’我曾尝试略微更改单位文件的名称,但这并没有’t在重新启动时停止了它的运行。

  14. 我的应用程序是用Kivy编写的,并在pi3上运行。如果手动启动,则运行正常,但使用自动运行时,触摸按钮不起作用。在pi2上运行正常,但是我不得不切换到pi3来提高性能。我尝试了crontab,rc local,profile,结果相同。任何想法如何解决这个问题?同样,所有方法都可以与pi2一起正常工作,但与pi3一起使用时,Kivy无法正确初始化。
    谢谢
    印加人

  15. 辉煌!在使用最新的Raspbian版本时,我的init.d脚本中断(称为python脚本,用于监听GPIO引脚并设置GPIO引脚)后,我找到了您对原因以及解决方案的解释。一世’ll stick with 系统的 unit files from 上.
    再次感谢。

  16. 汤姆·斯特拉顿

    这是使服务运行的一种很棒且简洁的方法。第一次效果很好,谢谢。

    我遇到了一个问题,尽管您的.service文件中包含以下内容,但您找不到我可以找到创建日志文件的证据:

    ExecStart = / usr / bin / 蟒蛇 /home/pi/myTestService.py>/home/pi/myTestService.log 2>&1

    The 蟒蛇 script is a 简单 counter updates every 10 seconds and prints the counter + time to the 屏幕. I expected the log file to contain this output.

    有什么指示或我应该开始探索日记系统吗?

    非常感谢

  17. 谢谢,这非常有帮助,让我快速上手!我唯一需要添加的是[Service]部分,我添加了WorkingDirectory行,因此我的日志文件和INI文件与脚本保存在同一文件夹中。否则,它们将被保存到根目录。因此,例如:

    [服务]
    类型=idle
    ExecStart = / usr / bin / 蟒蛇 /home/pi/myscript.py
    WorkingDirectory = / home / pi

  18. 几个小时后,试图用这些方法工作的时候,我已经用cron @ reboot,rc.local和init.d将我的头发拔了出来,运行了大约2分钟。非常感谢!

  19. 一些提示,主要针对任何新读者ðŸ™,

    1. The 系统的 docs have this to say about ExecStart – “redirection using “<", "<“, and “>>”, pipes using “|”,使用在后台运行程序“&”和shell语法的其他元素不受支持。”
    因此,对于日志记录,您应该改为使用config“StandardOutput=”,或使用默认值(journal)。

    2.关于“Type=idle” – “请注意,此类型仅对改善控制台输出有用,而对于一般的单元订购工具则无用”,您可能需要考虑使用“After=”

    参考文献:

    //www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines
    //www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
    //www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
    //www.freedesktop.org/software/systemd/man/systemd.unit.html#Before=

  20. 谢谢你的吹捧。

    请注意,用户服务应在/etc/systemd/user/servicename.service中定义,而不应放在指定的系统位置。我刚刚完成了此操作,它仍然完全按照您的描述运行。

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.