在本教程中,我们将向您展示在启动时在Raspberry Pi上运行程序的五种方法。 可用于在引导时运行程序的五种方法是:
示例程序
您可以使用任何要在启动时运行的程序; 在本教程中,我们使用的是一个示例python程序,它将在Raspberry Pi的启动时发言。这个示例程序将使用Espeak 包使Raspberry pi说“欢迎来到机器人世界”。
如果您没有安装Espeak 软件包,请在终端中运行以下命令进行安装:
sudo apt-get install espeak
要了解有关如何获取Raspberry Pi发言的更多信息,我们在此提供了一个教程。
在/ home / pi目录中,打开一个文件进行编辑:
sudo nano sample.py
并输入以下代码并保存(按CTRL + X并输入Y)。
#!/ usr / bin / env python
来自子进程导入调用
call(['espeak“欢迎来到机器人世界”2> / dev / null'],shell = True)
方法1:rc.local
在启动时在Raspberry Pi上运行程序的第一种方法是使用文件rc.local。为了在Pi启动时运行命令或程序,可以向rc.local 文件添加命令。如果您想在无头模式下启动Pi(即没有连接的显示器),并且在没有配置或手动启动的情况下运行程序,这将特别有用。
编辑rc.local
在你的Pi上, 使用你选择的编辑器编辑文件/etc/rc.local 。您必须使用root权限对其进行编辑:
sudo nano /etc/rc.local
添加命令以执行python程序,最好使用文件位置的绝对引用(首选完整的文件路径)。务必将行退出0 保留在末尾,然后保存文件并退出。在nano中,要退出,请键入Ctrl-x,然后键入Y.
如果您的程序连续运行(运行无限循环)或者可能不会退出,则必须确保通过在命令末尾添加&符号(“&”)来分叉该过程,如:
sudo python /home/pi/sample.py&
Pi将在启动时运行此程序,并在其他服务启动之前运行。如果您不包含“&”符号,并且程序连续运行,则Pi将无法完成其启动过程。&符号允许命令在单独的进程中运行,并在主进程运行时继续引导。
现在重启Pi来测试它:
sudo重启
提示
此外,请务必引用绝对文件名,而不是相对于您的主文件夹。例如,使用` / home / pi / myscript.py` 而不是` myscript.py` 。
如果将脚本添加到/etc/rc.local中,则会将其添加到引导顺序中。如果您的代码卡住,则启动序列无法继续。因此,请注意您尝试在启动时运行的代码并多次测试代码。您还可以将脚本的输出和错误写入文本文件(例如log.txt)并使用它进行调试。
sudo python /home/pi/sample.py&> /home/pi/Desktop/log.txt 2>&1
方法2:.bashrc
在启动时在Raspberry Pi上运行程序的第二种方法是修改.bashrc 文件。使用.bashrc方法,您的python程序将在引导时运行,并且每次打开新终端时,或者在建立新的SSH连接时运行。将命令放在'/home/pi/.bashrc'的底部。该程序可以在运行时使用'ctrl-c'中止!
sudo nano /home/pi/.bashrc
转到脚本的最后一行并添加:
echo在启动时运行
sudo python /home/pi/sample.py
上面的echo语句用于显示.bashrc文件中的命令在启动时执行以及连接到bash控制台。
现在重启Pi以听到Pi在启动时发言。
sudo重启
下图显示添加到.bashrc文件的命令即使在打开新终端时也会执行。
方法3:init.d目录
在启动时在Raspberry Pi上运行程序的第三种方法是将程序(在启动时运行)添加到/etc/init.d 目录。此目录包含在引导过程中启动的脚本(此外,此处的所有程序都在您关闭或重新引导系统时执行)。
使用以下行将要在启动时运行的程序添加到init.d目录:
sudo cp /home/pi/sample.py /etc/init.d/
移至init目录并打开示例脚本
cd /etc/init.d
sudo nano sample.py
将以下行添加到示例脚本中,使其成为Linux标准库(LSB)(软件系统结构的标准,包括Linux 操作系统中使用的文件系统层次结构)init脚本。
#etet/init.d/sample.py
### BEGIN INIT INFO
#提供:sample.py
#Required-Start:$ remote_fs $ syslog
#Required-Stop:$ remote_fs $ syslog
#Default-Start:2 3 4 5
#Default-Stop:0 1 6
#Short-Description:启动时启动守护程序
#说明:启用守护进程提供的服务。
### END INIT INFO
init.d脚本需要记录上述运行时依赖项,以便可以验证当前的引导顺序,使用这些依赖项引导的顺序,以及并行运行引导脚本以加快引导过程。
您可以按照此处的指南学习编写init.d脚本。
通过更改其权限,使init目录中的示例脚本可执行。
sudo chmod + x sample.py
运行此命令:
sudo update-rc.d sample.py默认值
现在重启以听到Pi在启动时发言。
sudo重启
方法4:SYSTEMD
在启动时在Raspberry Pi上运行程序的第四种方法是使用systemd文件。systemd提供了一个标准流程,用于控制Linux系统启动时运行的程序。请注意,systemd仅可从Raspbian OS的Jessie版本获得。
步骤1-创建单元文件
使用如下命令打开示例单元文件:
sudo nano /lib/systemd/system/sample.service
添加以下文字:
[单元]
说明=我的样品服务
之后= multi-user.target
[服务]
类型=空闲
ExecStart = / usr / bin / python /home/pi/sample.py
[安装]
WantedBy = multi-user.target
您应该保存并退出nano编辑器。
这定义了一个名为“Sample Service”的新服务,我们要求在多用户环境可用时启动它。“ExecStart”参数用于指定我们要运行的命令。“Type”设置为“idle”以确保ExecStart命令仅在其他所有内容都已加载时运行。请注意,路径是绝对路径,并定义Python的完整位置以及Python脚本的位置。
为了将脚本的文本输出存储在日志文件中,您可以将ExecStart行更改为:
ExecStart = / usr / bin / python /home/pi/sample.py> /home/pi/sample.log 2>&1
单元文件的权限需要设置为644:
sudo chmod 644 /lib/systemd/system/sample.service
第2步 - 配置systemd
现在已经定义了单元文件,我们可以告诉systemd在引导序列期间启动它:
sudo systemctl daemon-reload
sudo systemctl enable sample.service
重新启动Pi,您的自定义服务应该运行:
sudo重启
方法5:crontab
Raspberry Pi 1型号B +(B PLUS)512MB电脑板(2014)
通过Raspberry Pi
可以在此处找到有关使用crontab获取在引导时运行的程序的详细教程。
只要在启动顺序中运行Python脚本的位置并不重要,您就可以使用这些方法中的任何一种在启动时运行程序。如果您的脚本依赖于该时间点可用的任何系统功能,例如连接和可用的网络功能,则/ home / pi目录已安装并可供使用或 系统时间已由NTP更新, 那么它将理想的使用systemd或init.d方法。这些方法控制启动时执行脚本的启动点。