ubuntu使用systemd设置开机启动


ubuntu使用systemd设置开机启动

在项目过程中,经常会碰到需要设置开机启动脚本,以下将介绍使用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

[Install]
WantedBy=multi-user.target

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

sudo systemctl start autostart.service

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

sudo journalctl -f -u autostart.service

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

sudo systemctl enable autostart.service

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: 如果不能成功运行,尝试把Type改成forking.

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

你可能感兴趣的:(ubuntu系统,ubuntu)