ubuntu使用systemd设置开机启动


title: ubuntu使用systemd设置开机启动
date: 2021-11-17 18:57:11
tag: ubuntu
categories:

  • Ubuntu System

在项目过程中,经常会碰到需要设置开机启动脚本,以下将介绍使用systemd的方法设置开机启动。

确认systemd是否安装

systemd是一个跟随开发板的系统预装工具,用来管理软件启动和停止,一般来说ubuntu16以及以上的版本基本都有这个预装工具。如果系统已经预装了systemd,那么就可以用它来管理进程,反之如果没有,即使安装了,也不会被默认配置为系统管理工具。

可以用如下指令查询系统是否使用systemd工具:

systemd --version

如果系统返回了类似如下的信息,表明该系统是由systemd来管理软件的:

systemd 245 (245.4-4ubuntu3.11)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
设置开机自启动

为了使用systemd, 我们需要在 /etc/systemd/system 中添加后缀为 .service 的配置文件

例如我们需要运行如下的脚本文件 /home/nvidia/autostart.sh:

#! /bin/bash

sleep 10

killall python3

cd /opt/nvidia/deepstream/deepstream-5.0/source/deepstream_python_apps/apps/ds-usb-imagemeta

/usr/bin/python3 deepstream_imagemeta-multistream.py /dev/video0 &

配置文件可以这样写(autostart.service):

[Unit]
Description=python_detection
Documentation=
After=network.target
Wants=
Requires=

[Service]
ExecStart=/home/nvidia/autostart.sh 
ExecStop=
ExecReload=/home/nvidia/autostart.sh
Type=forking
Restart=always
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

使用如下命令测试autostart.service是否能够正常运行:

sudo systemctl start autostart.service

使用如下命令查看程序输出:

sudo journalctl -f -u autostart.service

如果修改了autostart.service, 需要使用如下代码进行更新:

sudo systemctl daemon-reload

如果能够正常运行,设置开机启动:

sudo systemctl enable autostart.service
程序自动重启
Restart=always
RestartSec=5
StartLimitInterval=0

参数详解

  • Restart=always: 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no
  • RestartSec=5: 重启间隔,比如某次异常后,等待5(s)再进行启动,默认值0.1(s)
  • StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启
service配置文件简单解析

参考:牧野星辰:https://www.cnblogs.com/downey-blog/p/10473939.html

在上面的配置文件中,为了演示起见,我将一些本测试脚本不需要但是比较重要的配置项也写了出来,其实如果不需要可以删除,但是[Unit]/[Service]/[Install]这三个标签需要保留。
我们来一个个简单介绍一下配置项:

Description:运行软件描述
Documentation:软件的文档
After:因为软件的启动通常依赖于其他软件,这里是指定在哪个服务被启动之后再启动,设置优先级
Wants:弱依赖于某个服务,目标服务的运行状态可以影响到本软件但不会决定本软件运行状态
Requires:强依赖某个服务,目标服务的状态可以决定本软件运行。
ExecStart:执行命令
ExecStop:停止执行命令
ExecReload:重启时的命令
Type:软件运行方式,默认为simple
WantedBy:这里相当于设置软件,选择运行在linux的哪个运行级别,只是在systemd中不在有运行级别概念,但是这里权当这么理解。  

TIPS:

  1. 如果不能成功运行,尝试把Type改成forking.

  2. 如果运行时找不到一些python包,尝试指定用户(如果未指定则使用root权限运行代码)

    [Service]
    User=nvidia
    ExecStart=/home/nvidia/autostart.sh 
    ExecStop=
    ExecReload=/home/nvidia/autostart.sh
    Type=forking
    

以上就是使用systemd设置开机启动的方法,如果大家对于该方法还有什么疑问,或者发现有什么错误,欢迎留言讨论!

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值