在树莓派上设置应用程序开机启动的五种方法

在树莓派上设置开机自动启动一个应用程序有五种方法:

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 方法。这两种方法可以控制在系统启动时执行脚本的时机。



1 评论

  1. 还有一个,可以在用户目录的.config目录下,新建一个xxx.desktop的文件

    文件内容如下
    [Desktop Entry]
    Name=程序名
    Comment=备注信息
    Exec=执行的命令
    Terminal=false
    MultipleArgs=false
    Type=Application
    Categories=Application;Development;
    StartupNotify=true

发表评论

你的邮件地址不会公开


*