如何在Raspberry Pi上启动时使用systemd启动程序

Raspberry Pi是功能强大的SBC(单板计算机),您可以将其用于各种应用程序和项目。它的多功能性在于它能够运行各种程序(包括自定义脚本)的能力,这在一定程度上要归功于Raspberry Pi OS和它运行的其他基于Linux的操作系统。

在Raspberry Pi上运行脚本或程序就像在系统上找到并执行它一样简单。但是,如果您想自动化该过程,可能是因为您的项目需要它,还是因为您想简化工作流程,该怎么办?

答案之一就是学习如何使用systemd。

什么是系统化的?

systemd是一套系统组件,用于在现代Linux系统上进行服务配置和行为。因为它是系统启动时启动的第一个进程,所以它的PID(进程标识符)为1。一般来说,systemd的目的是帮助您在系统启动时管理和执行程序。这就是在Pi上启动时将要利用的程序。

如前所述,有几种方法可以在Linux系统启动时运行程序,例如rc.local,cron和autostart。但是,如果您要启动GUI(图形用户界面)程序,在某些系统进程开始后自动运行应用程序,或者一遍又一遍地运行程序直到计划工作,systemd碰巧是一个更好的解决方案。

相关:如何使用Cron和Crontab在Linux中计划任务

如何在启动时使用systemd启动程序

systemd是在Linux系统上启动时启动程序的稍微复杂一些的方法。但是,与其他方法(我们上面提到的方法)相比,它提供的调度灵活性在各个方面都超过了它的复杂性。

systemd方法使用单位文件,这些文件类似于.ini文件,其中包含有关设备,服务,套接字,启动目标和其他基本系统组件的编码信息。

单位文件有各种类型。因此,根据您要声明的资源类型,您需要相应地选择一个单位文件类型。但是,出于本指南的目的,我们将坚持使用.service单位文件,该文件可让您管理系统上程序和脚本的启动行为。

以下是使用systemd在启动时启动脚本/程序所涉及的步骤的细分。

创建服务

要将程序设置为在启动时运行,请创建一个服务单元文件,该文件将告诉systemd运行哪个程序以及何时运行。这是操作方法。

  1. 在CLI窗口中,输入sudo nano /lib/systemd/system/display.service 。您可以为服务使用任何名称,只要该名称以.service扩展名结尾即可。
  2. 在服务文件中,粘贴以下代码行:
     [Unit]
    Description=PiCounter
    After=network.target
    [Service]
    ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
    Restart=always
    User=pi
    [Install]
    WantedBy=multi-user.target

您所有的常用配置选项都位于“单元”和“安装”部分下,而特定于服务的配置选项位于“服务”部分下。

您可能需要修改的一些上述指令值对包括:

一世。之后:确定何时启动服务。将其设置为network.target可确保列出的值(在这种情况下为network.target)在开始当前单位之前启动。但是,它没有为服务触发直接的依赖关系。这是通过其他指令(例如Wants,Requires和WantedBy)完成的。

当然,您可以更改此值以适合您的项目要求。例如,如果您希望程序在Raspberry Pi连接到网络后执行,则可以使用network-online.target值。您可以参考有关systemd的Fedora文档,以了解有关这些值的更多信息。

ii。 ExecStart:它包含您要在启动时执行的绝对路径和程序/脚本名称。因此,根据要执行的操作,您需要为这两个指令添加值。

iii。用户:它标识您的Raspberry Pi的名称。如果您更改了Pi的名称,则需要为用户输入该值。

iv。 WantedBy:这是为单元指定触发器的最常用方法。通过将其设置为multi-user.target ,您可以建立一个依赖关系,当系统控件移交给多用户外壳程序时,该依赖关系将运行程序。

此外,这也将在Pi的X-Windows系统启动之前运行您的程序,这意味着您甚至在登录系统之前就运行了程序。如果您希望脚本在登录Raspberry Pi之前运行,则可以执行此操作。

上面的代码行适用于非GUI程序。但是,如果要使用systemd运行GUI程序,则应将以下代码添加到服务文件中:

 [Unit]
Description=PiCounter
After=network.target
[Service]
Environment=Display=:0
Environment=XAUTHORITY/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
[Install]
WantedBy=multi-user.target

在上面的指令值对中,您只需更改ExecStart指令的值即可。将代码块中的一个替换为要在启动时运行的程序。填充服务文件后,请按CTRL + O进行保存。

测试服务

准备好服务后,手动验证其是否有效。为此,请在终端中键入以下命令: sudo systemctl start display.service 。该服务应成功执行您的指令。

完成后,请使用sudo systemctl stop display.service终止它。

启用服务

如果您成功使用该服务成功运行了程序,那么是时候启用它了,以便每次启动Raspberry Pi时它都能自动执行程序。

为此,请在终端窗口中键入sudo systemctl enable display.service 。完成后,输入sudo reboot重新启动您的Pi。

Raspberry Pi启动后,systemd应该按照提供的说明运行程序。

在Raspberry Pi上启动时自动启动程序

像大多数Linux系统一样,Raspberry Pi OS还允许您以多种方式完成操作,并且对于计划程序启动也是如此。因此,如果您想在启动时启动GUI程序/脚本并希望更好地控制您的日程安排,systemd显然是一种更好的方法。

就是说,但是,如果您想要一个更简单的解决方案或您的项目需求需要特定的计划,则可以查看我们的《在启动时运行Raspberry Pi程序或脚本》指南以了解更多信息。