在最新版本的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 系统的
- 数字海洋– How to use systemctl to manage 系统的 services and units
- ArchLinux– 系统的
49条留言
稍作调整:默认情况下,std out / err定向到journalctl(systemd’替换syslog的组件);但是使用python3脚本时,输出是双缓冲的,这意味着它将赢得’t通常不会出现在日志中(输出会不时刷新,这是不正确的),因此最好使用-u标志启动python3脚本。
谢谢!
嘿,我’我已经尝试过此方法和其他许多在线方法来自动运行python脚本。我的python脚本记录了一个视频,并使用for循环在指定的时间内保存了多个视频文件。当我使用您的方法(以及其他方法)时,摄像机的LED会打开,就像脚本实际上已在自动运行一样,但此后我找不到任何视频文件!为什么会这样呢?一世’我尝试了很多方法。
文件记录在哪里?可能是位置不在’在启动时安装?
I’我一直在努力尝试让我的Sense HAT能够在启动时登录到Google电子表格,这终于帮助了我!非常感谢。
我发现的一个技巧是,如果您正在读取文件(例如使用OAuth JSON),那么您还需要在脚本中提供完整路径。在systemctl状态的错误消息中发现此消息,可能对Noah有所帮助。
谢谢马特– I have a feeling I’我将大量使用它。 ðŸ™,
谢谢你
花了一天时间尝试使它生效,直到找到本教程。
其他人似乎缺少
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守护程序重新加载’.
背风处
单位文件必须以以下行开头:
[单元]
嗨,有人可以确认这个程序能解决我遇到的问题吗?
我已经在rpi论坛上详细介绍了该问题:
//www.raspberrypi.org/forums/viewtopic.php?f=28&t=133880
欢迎任何指导。
谢谢,这对我(Linux和Pi新手)有很大帮助。
对于其他新手,让’s note that
须藤chmod644 /lib/systemd/system/myscript.service
应该
须藤chmod 644 /lib/systemd/system/myscript.service
谢谢吉姆,我’ve更新了帖子以更正错误。
我有3个想要重新启动的Python程序。可以在启动时使用一个单位文件来启动3个Python程序吗?每个Python程序都需要一个单独的单元文件吗?
如何自动运行多个python脚本???
太好了,谢谢。
现在我的问题。您如何停止脚本?我在无限循环中运行。每隔10分钟,它会在特定时间轴上查找新推文。但是如何停止脚本运行以进行更改?
该技术实际上仅适用于运行一次的脚本。要每10分钟运行一次脚本,我将使用cron。
systemctl stop 剧本 service
systemctl start 剧本 service
和…在[service]部分中,您可以控制重新启动:
重新启动=失败|总是
RestartSec =…
…配置重新启动服务之前的休眠时间(使用Restart =配置)。接受以秒为单位的无单位值或时间跨度值,例如“5min 20s”. Defaults to 100ms.
不错的工作。谢谢。
步骤3中的重新引导是不必要的。后‘’只需通过以下方式启动服务:‘sudo systemctl启动myscript.service’.
我遵循了所有步骤,但是输入后收到错误消息 “”它说不存在这样的文件或服务。
该错误消息表示您要么避风港’t created the “myscript.service”文件,或者您使用其他名称,或者在错误的位置创建了文件。采用 :
cd /lib/systemd/system/my*.service
检查它是否存在于正确的目录中并被命名“myscript.service”.
这正是我想要的。干杯。
感谢分享!正常工作!但不是日志文件。但是我用过:
ExecStart = / usr / bin / 蟒蛇 /home/pi/myscript.py>/home/pi/myscript.log 2>1
注意区别吧’s 2>1 and it’现在登录/ var / log / messages并查看它,只需运行
journalctl -u 剧本
或将完整路径放入您的.service文件:
sudo systemctl启用/some/folder/myscript.service
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
在这一行中使用python3:
ExecStart = / usr / bin / 蟒蛇 /home/pi/myscript.py
与上述MD相同的问题。我试过了:
ExecStart = / usr / bin / 蟒蛇3 /home/pi/myscript.py
还是同样的问题。还有其他建议吗?
您的行后面有一个空格字符“python3”. Try :
ExecStart=/usr/bin/python3/home/pi/myscript.py
你好,我看不到任何日志文件创建。我怎么看我的输出?即使不添加该日志文件行,它也不会显示在终端中
你赢了’运行脚本时未建立任何终端会话,因此看不到任何输出。
谢谢你,我’一个n00b,但尝试学习。当我遇到旧的使用方法时非常困惑’m using Jessie.
问题,这种方法可以在启动时启动另一个程序吗?我想在后台启动TTYMidi
ExecStart = / usr / local / bin / ttymidi -s / dev / ttyAMA0 -b 38400 -v&
I’我已经阅读了有关编辑rc.local的内容,但希望找到‘right’ way 🙂
瑜伽士
我有一个问题,就像法赞一样–日志文件不起作用。当我只在终端中从ExecStart运行命令时,一切正常,但是如果从systemctl运行,则日志文件不会’t fills.
嗨,马特,
一个很好的解释和教程,它很好用。
删除/修改以使其在启动时停止运行的最佳位是哪一位?我需要花一些时间来写剧本,但是不要’希望旧版本与新版本同时运行。一世’我曾尝试略微更改单位文件的名称,但这并没有’t在重新启动时停止了它的运行。
我想我可能已经知道了。有一个流浪文件“myscript”那是造成问题的原因。
Reg。
我的应用程序是用Kivy编写的,并在pi3上运行。如果手动启动,则运行正常,但使用自动运行时,触摸按钮不起作用。在pi2上运行正常,但是我不得不切换到pi3来提高性能。我尝试了crontab,rc local,profile,结果相同。任何想法如何解决这个问题?同样,所有方法都可以与pi2一起正常工作,但与pi3一起使用时,Kivy无法正确初始化。
谢谢
印加人
辉煌!在使用最新的Raspbian版本时,我的init.d脚本中断(称为python脚本,用于监听GPIO引脚并设置GPIO引脚)后,我找到了您对原因以及解决方案的解释。一世’ll stick with 系统的 unit files from 上.
再次感谢。
这是使服务运行的一种很棒且简洁的方法。第一次效果很好,谢谢。
我遇到的一个问题,尽管我的.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.
有什么指示或我应该开始探索日记系统吗?
非常感谢
谢谢,这非常有帮助,让我快速上手!我唯一需要添加的是[Service]部分,我添加了WorkingDirectory行,因此我的日志文件和INI文件与脚本保存在同一文件夹中。否则,它们将被保存到根目录。因此,例如:
[服务]
类型=idle
ExecStart = / usr / bin / 蟒蛇 /home/pi/myscript.py
WorkingDirectory = / home / pi
感谢出色的教程兄弟。您能告诉我如何使用这种方法在启动时运行多个python脚本吗?
谢谢你!一整天都在梳着头发ðŸ™,终于成功了!
几个小时后,试图用这些方法工作的时候,我已经用cron @ reboot,rc.local和init.d将我的头发拔了出来,运行了大约2分钟。非常感谢!
非常感谢….such一个很棒的博客一切正常
简单,直截了当,最重要的是….working!!!!
太感谢了!!
一些提示,主要针对任何新读者ðŸ™,
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=
谢谢
只是想说这对我有所帮助。
非常感谢你!
谢谢你的吹捧。
请注意,用户服务应在/etc/systemd/user/servicename.service中定义,而不应放在指定的系统位置。我刚刚完成了此操作,它仍然完全按照您的描述运行。
曼恩·坦克斯!
这对我有用,除了访问DISPLAY时遇到问题。
添加此内容可解决HOURS之后的所有问题
用户= pi
组= pi