在树莓派上设置开机自动启动一个应用程序有五种方法:
1、rc.local 配置
2、.bashrc 配置
3、init.d tab 配置
4、systemd 配置
5、crontab 计划任务
我们使用一个例子程序,其功能是在树莓派启动时播报「Welcome to the world of Raspberry Pi」。该程序使用 Espeak 库实现,因此需要安装依赖项。
sudo apt-get install espeak
进入 /home/pi 目录运行下面的命令创建 sample.py 文件。
sudo nano sample.py
贴入下面的代码并保存(CTRL+X 后键入 Y 回车)。
#! /usr/bin/env python from subprocess import call call(['espeak "Welcome to the world of Raspberry Pi" 2>/dev/null'], shell=True)
设置开机启动的方法如下。
方法 1:rc.local 配置
编辑 /etc/rc.local 文件,需要使用 root 权限才能写入。
sudo nano /etc/rc.local
在文件的 exit 0 这行之前加入下面的命令文本之后保存这个配置文件:
sudo python /home/pi/sample.py &
配置好之后每当树莓派启动时,都会在其他服务启动前先运行这行命令。也正因为如此,当你的程序依赖某个服务时(如网络),需要等待这些服务正常启动之后才不会出错。
如果你希望记录程序的运行结果,还可以添加程序的输出,例如:
sudo python /home/pi/sample.py & > /home/pi/Desktop/log.txt 2>&1
方法 2:.bashrc 配置
第二种方法是修改 .bashrc 文件。
sudo nano /home/pi/.bashrc
在 /home/pi/.bashrc 文件的末尾添加启动命令文本。
echo Running at boot sudo python /home/pi/sample.py
上面的 echo 命令用于显示 .bashrc 文件中的脚本已经开始运行。
Bash RC 配置程序会在树莓派启动时自动运行。.bashrc 文件中的命令在运行时会打开一个新的终端窗口。
方法 3:init.d 目录配置
第三种方法是通过把应用程序加入到 /etc/init.d 目录来实现开机自动运行。这个目录中包含了一系列的启动时加载的脚本,另外这些脚本也可以被配置成在系统关机时执行。
将脚本复制到 /etc/init.d 目录中。
sudo cp /home/pi/sample.py /etc/init.d/ cd /etc/init.d
编辑脚本加入启动配置信息。
sudo nano sample.py
# /etc/init.d/sample.py ### BEGIN INIT INFO # Provides: 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: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO
init.d 脚本还支持设置启动顺序,学习如何编写 init.d 脚本可以参考这个文档。
Initd 配置程序会在树莓派启动时自动运行。你还需要确保这个脚本具有执行权限。
sudo chmod +x sample.py sudo update-rc.d sample.py defaults
方法 4:SYSTEMD 配置
第四种方法是配置 systemd 文件。
sudo nano /lib/systemd/system/sample.service
添加下面的内容:
[Unit] Description=My Sample Service After=multi-user.target [Service] Type=idle ExecStart=/usr/bin/python /home/pi/sample.py [Install] WantedBy=multi-user.target
保存之后退出编辑器即可。
这里定义了一个名为 Sample Service 的服务,我们希望在多用户环境下依然有效启动一次。
ExecStart 参数用于指定启动的命令文本。
Type 设置为 idle 是为了确保其他一切都已加载之后再执行。
如果需要保存运行输出结果,可以按照如下配置:
ExecStart=/usr/bin/python /home/pi/sample.py > /home/pi/sample.log 2>&1
文件权限需要设置成 644:
sudo chmod 644 /lib/systemd/system/sample.service
至此还没结束,需要再进行下面的配置才行。
sudo systemctl daemon-reload sudo systemctl enable sample.service
方法 5:crontab 计划任务
有关使用 crontab 在启动时运行程序的详细教程可以在 https://shumeipai.nxez.com/2019/12/11/scheduling-tasks-with-cron.html 找到,本文不再赘述。
如果运行的脚本在启动序列中的顺序不重要,那么可以使用上面五种方法中的任意一种。如果脚本依赖于该时间点可用的任何系统功能,例如网络是否已连接上、/home/pi 目录是否已挂载,或者 NTP 已更新系统时间,那么推荐使用 systemd 或 init.d 方法。这两种方法可以控制在系统启动时执行脚本的时机。