树莓派程序的自启动方法有很多,我所尝试的能够显示OpenCV图形界面的,有以下两种。
一种是桌面方式启动,一种是使用systend配置服务。
1.桌面启动方式
优点:操作简单。
缺点:只能够实现自启动功能,没有程序异常退出时进程自动重启这种高级功能。
在/home/pi/.config/目录下新建一个名为 autostart 的文件夹:
cd /home/pi/.config/
mkdir autostart
在该文件夹下编写一个Desktop Entry
文件指向你的应用程序。Desktop Entry
文件是Linux
桌面系统中用于描述程序启动配置信息的文件,它以.desktop
为后缀名,相当于Windows
系统下的桌面快捷方式。
新建一个Desktop Entry文件,只要以.desktop
为后缀名即可。
cd /home/pi/.config/autostart
touch example.desktop
打开文件,写入以下内容。(Linux下nano编辑器的使用)
[Desktop Entry]
Name=example
Type=Application
Exec=/usr/bin/python /home/pi/example.py
Terminal=false
Exec部分写入你的程序执行指令就好了,最好写绝对路径,例如这里调用python程序用的是/usr/bin/python。
2.使用systemd将程序配置成服务
优点:功能非常强大,除了配置服务自启动外,还可以让他退出自动重启,配置依赖关系等等。
缺点:指令比较多吧,学习起来慢一点。
首先,新建service文件
touch example.service
修改文件内容如下: (Linux下nano编辑器的使用)
[Unit]
Description=example service
[Service]
ExecStart=/usr/bin/python /home/pi/example.py
Environment=XAUTHORITY=/home/pi/.Xauthority
Environment=DISPLAY=:0.0
Restart=always
User=pi
type=idle
[Install]
WantedBy=multi-user.target
稍微解释一下。
ExecStart,写启动你程序的指令,同样,最好绝对路径。
Environment,我这里写的是使用OpenCV必须要配置的环境,是获得当前窗口的作用。
Restart,配置什么状态下重启,我这里配置的是always,即退出总是重启。
type,我配置的idle,意思是等其他服务都启动完毕后再启动我的这个服务。
开机时,systemd只执行/etc/systemd/system目录里面的配置文件,把我们的service文件拷贝过去。
sudo cp example.service /etc/systemd/system/example.service
一旦修改配置文件,就要让 systemd重新加载配置文件,否则修改不会生效。
sudo systemctl daemon-reload
至此,已经将我们的程序配置为服务,可以使用以下指令验证一下。
#开启服务
sudo systemctl start example.service
#关闭服务
sudo systemctl stop example.service
如果你和我一样,将Restart配置为always。那么除非你使用上面的指令关掉服务,否则是无法杀死程序的。可以试验一下:
#找到程序的进程号
ps -aux | grep example.py
#杀死该进程
kill -9 进程号
#程序会被杀死,等待个几秒钟,在查看一下
ps -aux | grep example.py
#可以看到程序已经重启
接下来配置程序开机自启:
sudo systemctl enable example.service
sudo systemctl daemon-reload
至此,整个配置过程结束。
参考:阮一峰老师的Systemd 入门教程