赞
踩
声明:本人使用树莓派4B+ 8G安装的ubuntu20.04系统。
在ubuntu系统下,我们常常需要自己写的一些程序能够开机自启动,避免每次都需要的繁琐操作。在网上搜罗了一圈,大多数都是针对桌面版的介绍,对于无界面的远程版不是找不到就是试过很多次发现都无效!!!气的人心肝脾肺疼。当然也跟个人水平相关T-T。摸索了一下终于试出了一个百分百可靠的方法,虽然可能比较复杂,但能够很好的帮助理解自启动的逻辑,仅凭个人理解,所以见仁见智吧。
ubuntu系统的service(服务)是随开机自启动的,并且在后台运行的程序。Ubuntu系统在开机时会先执行 /etc/systemd/system/目录下的各个服务(.service)程序,因此我们可以编写服务来实现程序开机自启动的功能。下面我们以开机执行一个python程序为例:
在/etc/systemd/system/目录下创建一个服务startsocket.service。
桌面版:
sudo gedit /etc/systemd/system/startsocket.service
服务器版(远程登录):
sudo vim /etc/systemd/system/startsocket.service
一般正常的启动文件主要分成三部分:
[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
重载服务列表:
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里面写自己的程序就可以啦。
以上就是要讲的所有内容,本文仅仅简单介绍了服务+脚本的方法实现开机自启动,都是最简单的操作了,主要是理解自启动的实现过程,然后根据自己的需求就可以完成各式各样的功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。