前言
开发arm架构的嵌入式系统时,常常遇到需要开机自启的情况,在Ubuntu中实现开机自启有多种方法,例如编写.desktop脚本放置进用户.config文件夹中实现登录后开机自启。这种方式实现的程序输出需要自己手动重定向至文件,这里介绍的使用systemd将自己的程序作为服务开机自启的方式可以使用systemctl进行程序输出的捕获,比较简便。
操作步骤
创建服务单元文件
首先在目录:/etc/systemd/system中创建服务单元文件,即.service文件。
例如,创建一个名为start_program.service的服务单元文件
cd /etc/systemd/system
sudo touch start_program.service
使用vim或者其他文本编辑器打开文件,按照以下格式输入服务信息:
[Unit]
Description=My Program
[Service]
ExecStart=/path/to/your/program
Restart=always
User=your_username
[Install]
WantedBy=multi-user.target
其中
"Description"为服务的描述,可以随便填写。
"ExecStart"参数为程序的二进制文件路径,这个参数一定要写对,可以在新建终端中键入此路径,看看自己的程序是否正常启动,以确保此参数无问题。
"Restart"参数为程序杀死时服务的的状态,参数为"always"时程序杀死后,将会自动重启。
其他参数与详情可以参照此文章
重新加载服务
将服务单元文件配置好后需要重新加载服务才能正常开启服务
sudo systemctl daemon-reload
开启服务
重新加载服务完成后,以start_program.servic为例,输入以下指令开启服务
sudo systemctl enable start_program.service
其中“start_program.service”为第一步创建的服务单元的文件名,请注意修改。
重启验证
一切配置完成后,就可以重启主机来验证自己的程序时候启动了,可以使用
top
观察进程中是否有自己的程序名
或者使用systemctl
sudo systemctl status start_program.service
其中“start_program.service”为第一步创建的服务单元的文件名,请注意修改。
观察当前服务的状态以及部分日志。
捕获服务输出
Ubuntu20.04中,服务的输出日志被重新定向至’systemd-journald’中,可以使用journald命令查看日志
sudo journalctl -u start_program.service
其中“start_program.service”为第一步创建的服务单元的文件名,请注意修改。
然而,这种方式查看日志时,服务重启后的日志似乎没有成功记录,但status中的日志却是正常的,不知是什么Bug,以后有时间再研究研究。。。
上面这条指令可以再添加一个 -f 的参数,这样就能实时捕获输出了
sudo journalctl -f -u start_program.service
但这种方式捕获的日志有时候会出现问题,最好还是将日志输出重新定向到文件,然后再使用tail命令去捕获,这样也方便出错时进行Debug,具体做法别人实现了,我以后再研究。绝对不是懒