译介|在树莓派上自动运行你的代码 Run your Raspberry Pi code automatically
原作者:twitter@ben_everard 翻译: @xDiexselhttps://magpi.raspberrypi.org/issues/98magpi.raspberrypi.org
原文刊载于Magpi98
当你为你的树莓派项目写了一些代码,需要每次树莓派开机时自动运行,你该怎么做?也许最简单的方法是在/etc/rc.local文件中添加一行代码,这种Bash脚本可以在树莓派开机时自动运行,是一种快速且简单的方法,但却存在一些缺点:如果你的脚本输出了信息或者报错,你该如何查看?
如何得知脚本崩溃情况并重新运行?
能否方便得停止运行或重载脚本?
幸运的是树莓派所使用的Linux系统有一种管理后台的机制:systemd,它是一种在树莓派和其它Linux系统电脑上广泛使用的用来管理各种关键功能的服务层。从数据库到窗口管理,它提供了一种控制软件在后台运行的方式。接下来然我们看一下该如何使用。
systemd有很多功能,我们需要使用到的是“services”,它的作用是在后台运行软件。
我们使用一个非常简单的Python脚本来不断输出文本“hello world”,这个简单的脚本将展示我们要自动运行代码所需的技巧并获得程序的输出。
脚本的代码如下:
#!/usr/bin/python
import time import sys
while True:
print "hello world"
sys.stdout.flush()
time.sleep(1)
这里有几个不同寻常的地方,第一行代码用来告诉操作系统运行这个脚本所使用的程序,在这里是Python二进制文件的完整路径。在其它Linux发行版中可能有所不同,如果你不能确定,在终端中运行 which python便可得知。
第二个不同寻常之处是调用了sys.stdout.flush(),严格来说这行代码并不是必需的,它的作用是告诉操作系统将程序的所有输出都通过输出缓冲区到达指定位置。我们发现当没有这行代码程序的输出要保存的日志当中需要很长的一段时间,因此你或许会发现你的程序 中可以不包含这段代码也能正常运行(或者仅将它包含在主循环中)。
我们将上面的代码写入hello-service.py文件并保存在/home/pi目录下。
最后,我们使用以下命令将其变成可执行文件。
chmod a+x /home/pi/hello-service.py
运行脚本
准备好我们的脚本之后,现在将其运行为一种服务。为了让systemd知道我们简单的服务脚本要做什么,我们需要创建一个unit文件,unit文件可以包含很多内容,但是对于简单的使用来说也可以写得很简洁。我们的unit文件代码如下:
[Unit]
Description=A service to say hello world
After=systemd-user-sessions.service
[Service]
Type=simple
ExecStart=/home/pi/hello-service.py
这段代码告诉了一些关于脚本的基本信息,After部分告诉systemd脚本于何时运行,在本例中脚本将紧接着systemd-user-sessions(一个每次开机都会运行的系统进程)启动。Type=simple告诉systemd该命令在由其开启的会话中继续运行。最后一行代码告诉systemd将要运行什么命令。
将这个unit文件保存在home/pi目录下命名为hello.service,然后使用以下命令将其复制到systemd目录中:
sudo cp /home/pi/hello.service /etc/systemd/system
到此为止所需的步骤基本完成,接下来仅需告诉systemd我们要做什么。
使用下面的命令来开启服务:
systemctl start hello.service
查看服务状态:
systemctl status hello.service
停止服务:
systemctl stop hello.service
这种管理服务的方式使得代码运行起来更简单,而不用去大动干戈地查询进程的PIDs来终止或重启服务。更重要的是服务一旦启动,systemd将会一直对其监视,如果程序由于某些原因而崩溃,其将尝试重新运行。但这并不是你创作非常不稳定代码的理由,而是当你的代码需要持续运行时的一道额外的防线。
如果你想要查看该服务的输出,你可以使用journalctl:
journalctl -u hello -e
我们上面的工作创建了一个服务并使其得以运行,但是它不会在开机时自动启动,为了使程序自运行,你需要使用下面的命令来开启服务:
systemctl enable hello.service
完成了上面所有的步骤之后你就可以重启机器然后程序将自动运行,如果你想要停止程序的自运行可以使用下面的命令:
systemctl disable hello.service
systemd的功能远不止这些,但通过这些基础你就可以让你的代码在后台稳定地运行。
ps:翻译水平拙劣,如有错误请各位指正。