前言

声明:本人使用树莓派4B+ 8G安装的ubuntu20.04系统。

在ubuntu系统下,我们常常需要自己写的一些程序能够开机自启动,避免每次都需要的繁琐操作。在网上搜罗了一圈,大多数都是针对桌面版的介绍,对于无界面的远程版不是找不到就是试过很多次发现都无效!!!气的人心肝脾肺疼。当然也跟个人水平相关T-T。摸索了一下终于试出了一个百分百可靠的方法,虽然可能比较复杂,但能够很好的帮助理解自启动的逻辑,仅凭个人理解,所以见仁见智吧。


一、服务(Service)是什么?

ubuntu系统的service(服务)是随开机自启动的,并且在后台运行的程序。Ubuntu系统在开机时会先执行 /etc/systemd/system/目录下的各个服务(.service)程序,因此我们可以编写服务来实现程序开机自启动的功能。下面我们以开机执行一个python程序为例:

二、编写服务

1.创建服务

在/etc/systemd/system/目录下创建一个服务startsocket.service。

桌面版:
sudo gedit /etc/systemd/system/startsocket.service
服务器版(远程登录):
sudo vim /etc/systemd/system/startsocket.service

2.撰写服务内容

一般正常的启动文件主要分成三部分:

[Unit] 段: 启动顺序与依赖关系
[Service] 段: 启动行为,如何启动,启动类型
[Install] 段: 定义如何安装这个配置文件,即怎样做到开机启动
编写刚刚创建的服务文件:

[Unit]
Description=startsocket #服务描述
After=syslog.target	#该服务启动在什么之后

[Service]
ExecStart=/home/ubuntu/start_socket.sh	#服务需要执行的脚本
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target graphical.target	#在多用户模式和图形化界面下启动

填写完毕后保存退出即可。(如果是vim打开的,先按 esc 、再按 :x ,即可保存退出)
VIM命令介绍:https://blog.csdn.net/wangguchao/article/details/81780567

3.设置服务自启动

重载服务列表:
sudo systemctl daemon-reload
设置服务自启动:
sudo systemctl enable startsocket.service

执行完以后就会提示已经创建成功

Created symlink /etc/systemd/system/multi-user.target.wants/startsocket.service → /etc/systemd/system/startsocket.service.
Created symlink /etc/systemd/system/graphical.target.wants/startsocket.service → /etc/systemd/system/startsocket.service.

如果是disable,则是

Removed /etc/systemd/system/multi-user.target.wants/startsocket.service.
Removed /etc/systemd/system/graphical.target.wants/startsocket.service.

服务相关的操作:

sudo systemctl disable xxx (关闭某个服务自启动)
sudo service xxx start (手动启动某个服务)
sudo service xxx restart (重启某个服务)
sudo service xxx stop (停止某个服务)
sudo service xxx status (查看某个服务的运行状态)
journalctl -fu xxx (查看程序的输出)

如查看服务的状态,active就是正在运行。

ubuntu@ubuntu:~$ sudo service startsocket status
● startsocket.service - startsocket
     Loaded: loaded (/etc/systemd/system/startsocket.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-12-24 01:26:37 UTC; 6min ago
   Main PID: 1709 (start_socket.sh)
      Tasks: 3 (limit: 9251)
     CGroup: /system.slice/startsocket.service
             ├─1709 /bin/bash /home/ubuntu/start_socket.sh
             ├─1721 sudo -S python3 main.py
             └─1762 python3 main.py

Dec 24 01:26:37 ubuntu systemd[1]: Started startsocket.
Dec 24 01:26:39 ubuntu sudo[1721]:     root : TTY=unknown ; PWD=/home/ubuntu/raspReboot ; USER=root ; COMM>
Dec 24 01:26:39 ubuntu sudo[1721]: pam_unix(sudo:session): session opened for user root by (uid=0)
lines 1-13/13 (END)

二、编写脚本

上面编写的服务在开机时会启动一个名为start_socket.sh的脚本。下面我们来创建这个脚本:

(1)创建脚本:

touch start_socket.sh

(2)赋予可执行权限

chmod +x start_socket.sh

(3)编辑脚本

gedit start_socket.sh
或
vim start_socket.sh

(4)填写内容

#!/bin/bash
cd /home/ubuntu/pythontest
python3 main.py

该脚本的意思为进入/home/ubuntu/pythontest文件夹执行python3 main.py程序。在这个脚本里填写的就是开机能执行的程序了,根据自己的需求在这里填写对应的执行命令即可。需要注意的是执行的文件保证都已经赋予过可执行权限。

三、编写程序

最后在脚本中提到的main.py里面写自己的程序就可以啦。

总结

以上就是要讲的所有内容,本文仅仅简单介绍了服务+脚本的方法实现开机自启动,都是最简单的操作了,主要是理解自启动的实现过程,然后根据自己的需求就可以完成各式各样的功能。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐