Ubuntu20.04下将自己的程序作为服务开机自启并程序杀死时自动重启

Ubuntu20.04下将自己的程序作为服务开机自启并程序杀死时自动重启

前言

开发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"时程序杀死后,将会自动重启。
其他参数与详情可以参照此文章

systemd服务详解

重新加载服务

将服务单元文件配置好后需要重新加载服务才能正常开启服务

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,具体做法别人实现了,我以后再研究。绝对不是懒

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值