【Linux】使用systemd设置开机自启动命令

2023-11-20

1 使用使用systemd实现开机自动运行命令

systemd是Linux系统中现代化的初始化系统,可以使用它来实现开机自动运行命令。在systemd中,可以通过创建一个service文件,把要执行的命令放在其中,然后将其添加到systemd的自启动项中。

具体操作步骤如下:

1.1 新建一个.service文件

首先在终端中使用sudo权限创建一个.service文件,用于存储service配置:

sudo vim /etc/systemd/system/myservice.service

1.2 编写.service文件

在打开的文件中添加以下内容(此处演示的开机自启命令是需要sudo权限的),注意将其中的ExecStart替换为需要开机自启动的具体命令,ExecStart后面加上sudo。

[Unit]
Description=My Service
After=network.target

[Service]
Type=simple
ExecStart=sudo /path/to/my/command
User=root

[Install]
WantedBy=multi-user.target

在这里插入图片描述

1.2.1 [Unit]

[Unit]是systemd服务文件的一个部分,用于定义服务的基本信息。

  • Description字段包含了一个简短的描述,用于描述服务的名称,方便用户在查找时快速了解服务的作用。

  • After=network.target表示此服务会在网络服务启动后启动。

    • network.target是指网络目标单元,是Systemd中预定义的一个特殊单元,用于表示网络服务的启动状态。几乎所有的网络服务,例如DHCP、DNS解析等,在启动时都依赖于网络服务的可用性。因此,将After=network.target添加到服务的unit文件中,可以确保该服务在网络服务就绪后再启动,从而避免出现启动时的依赖性错误。

1.2.2 [Service]

[Service]是systemd服务文件中的另一个部分,用于定义服务的具体行为。

  • Type字段是服务运行时的类型,simple表示它是一个后台进程,通常用于只有一个进程的服务。
  • ExecStart字段包含了要运行的命令,多个命令可以用换行符(\n)隔开。
  • User字段指定了以哪个用户的身份运行这个服务,这里选择root用户。

1.2.3 [Install]

[Install]定义了systemd服务的安装信息。

  • WantedBy字段指定了服务将要执行的“target”(一种操作系统运行级别),这里指定的“multi-user.target”是Linux系统默认的、包含多个用户的运行级别,相当于传统的“init 3”运行级别。这意味着服务将在系统启动时自动运行。

1.3 启动服务并设置自启动

保存并退出上述.service文件,下面的命令可以启动服务并将其添加到系统自启动项中:

sudo systemctl start myservice
sudo systemctl enable myservice

执行完该命令后,可以使用systemctl命令来查看该服务的状态:

sudo systemctl status myservice.service

启动服务后,它将在系统启动时自动启动。也可以在任何时候使用以下命令停止服务并从自启动项中删除:

sudo systemctl stop myservice
sudo systemctl disable myservice

2 编写Systemd服务文件的要点

2.1 Systemd服务文件的位置

Systemd服务文件通常存放在/etc/systemd/system目录下。该目录包含了各种类型的服务文件,如系统服务、用户服务、网络等等。

2.2 Systemd服务文件的格式

Systemd服务文件通常是以.service结尾的文本文件。服务文件中的各项设置使用键值对的形式指定,每一行都是以key=value的形式组成。

2.3 Systemd服务文件的基本结构

Systemd服务文件通常包含了以下配置项:

  • [Unit]:服务的全局信息和依赖性声明,如服务名称、描述等。

  • [Service]:指定服务的具体配置,如服务执行的命令、工作目录等。

  • [Install]:指定服务的安装方式,如服务的启动级别等。

2.3.1 [Unit]字段的配置

  • Description:对服务的简短描述。

  • Before:定义服务在其他服务之前启动。

  • After:定义服务在其他服务之后启动。

  • Requires:定义服务启动需要哪些其他服务已启动,否则无法启动。

  • PartOf:定义该服务是其他服务的一部分,如果其他服务停止,该服务也会停止。

  • Wants:定义服务启动时可同时启动哪些其他服务。

  • Condition...:定义服务启动的条件,如ConditionPathExists表示某个路径存在时才启动该服务。

2.3.2 [Service]字段的配置

  • Type:服务类型,可以是simple、forking、ondemand、notify等。

  • ExecStart:服务启动命令,可以是单个命令、脚本文件、或者多个命令组成的脚本。

  • ExecStop:停止服务的命令。

  • User:定义服务运行的用户。

  • Group:定义服务运行的用户组。

  • PrivateTmp:将服务的/tmp目录挂载到私有的命名空间中,以增强安全性。

  • Restart:定义服务异常退出时如何重启。

  • WorkingDirectory:定义服务工作目录。

  • Environment:定义服务的环境变量等。

  • ProtectSystem:防止服务对系统文件进行修改。

  • NoNewPrivileges: 防止服务通过setuid或setgid等提升权限。

2.3.3 [Install]字段的配置

  • WantedBy:定义在哪些系统运行级别下启用此服务。

  • RequiredBy:启动其他系统服务时必需启动此服务。

2.4 示例 .service 文件

[Unit]
Description=MyService
After=network.target
  
[Service]
Type=simple
ExecStart=/usr/bin/myservice
WorkingDirectory=/var/myservice
User=myservice
Group=myservice
Restart=always
RestartSec=30
StartLimitInterval=400
StartLimitBurst=3
  
[Install]
WantedBy=multi-user.target

这个示例中定义了一个名为"MyService"的服务,服务启动时执行/usr/bin/myservice命令,执行工作目录为/var/myservice,运行用户为myservice。如果服务异常退出,则每30秒尝试重新启动,最多尝试3次。最后,服务将在多用户运行级别下启用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】使用systemd设置开机自启动命令 的相关文章

  • Linux 阻塞与非阻塞串行读取

    I have 这段代码 https stackoverflow com questions 6947413 how to open read and write from serial port in c用于在Linux中从串行读取 但我不
  • C# - OPC-UA 服务器应用程序尚未在 Linux 计算机中创建 PKI 证书

    当我跑步时OPC UA serverWindows 机器中的 C 应用程序 然后 OPC UA 服务器已创建证书路径C ProgramData OPC Foundation pki own 并在此路径中生成一些证书 但是当我在中安装 OPC
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • VSCODE 在 Linux 上不适用于我

    刚刚了解 VSCODE 很高兴尝试一下 我下载 解压并运行可执行文件 我得到 Code 2183 0429 201254 ERROR browser main loop cc 170 Running without the SUID san
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • 如何修复 /usr/bin/env 参数处理?

    我遇到了一个奇怪的问题 usr bin env 我设计了一个简单的脚本来显示问题 该脚本使用 Ruby 编写 但使用 Python 编写的类似脚本也会发生同样的情况 这是脚本 usr bin env ruby p ARGV 还有一个没有 u
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 警告构建使用导出符号的内核模块

    我有两个内核模块 例如 modA 和 modB modA 导出一个符号EXPORT SYMBOL symA modB 使用它 我有标题modA h对于modA extern void symA int param and in modB c
  • 如何从powershell获取主机名?

    我如何获得hostname https stackoverflow com q 42014215 262852 for dur来自 powershell PS home thufir powershell gt PS home thufir
  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • Bash 脚本错误 [重复]

    这个问题在这里已经有答案了 我想知道下面的脚本有什么错误 我收到错误为 command not foundh line 1 command not foundh line 2 其连续的 我试过添加 但现在工作请告诉我该怎么做 bin bas
  • 第一次如何配置postgresql?

    我刚刚安装了 postgresql 并在安装过程中指定了密码 x 当我尝试做的时候createdb并指定我收到消息的任何密码 createdb 无法连接到数据库 postgres 致命 用户密码身份验证失败 同样适用于createuser
  • pip 找不到满足要求的版本 django==2.2.1

    我刚刚将操作系统更改为 linux 并且想安装 django 但我无法安装最新版本的 django 我努力了 pip install django 但是它安装了 django 1 11 11 这不是我需要的 我还将我的 pip 升级到了 1
  • 在 Windows 下使用 linux 实用程序的最佳方法是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Linux 实用程序 如 sed awk 和其他 shell 脚本功能 非常棒 但当我在 Windows 上进行开发并且无法使用其中任何一
  • 使用inotify监控文件

    我正在使用 inotify 来监视本地文件 例如使用 root temp inotify add watch fd root temp mask 删除该文件后 程序将被阻止read fd buf bufSize 功能 即使我创建一个新的 r
  • tcmalloc/jemalloc 和内存池之间有什么区别(以及选择的理由)?

    tcmalloc jemalloc是改进的内存分配器 还引入了内存池以更好地分配内存 那么它们之间有什么区别以及在我的应用中如何选择它们呢 这取决于您的程序的要求 如果您的程序有更多的动态内存分配 那么您 需要从可用的分配器中选择一个内存分
  • python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?

    Python 的 fcnt 模块提供了一种名为 flock 1 的方法来证明文件锁定 其描述如下 对文件执行锁定操作op 描述符 fd 文件对象提供 fileno 方法被接受为 出色地 请参阅 Unix 手册集群 2 了解详情 在某些系统上

随机推荐

  • 实现一个函数,判断一个数是不是素数

    include
  • Stream实现List和Map互转总结

    本文来说下Stream实现List和Map互转总结 文章目录 实体类 Map转List代码 List转Map代码 实体类 本篇介绍Stream流List和Map互转 同时在转换过程中遇到的问题分析 package cn wideth col
  • 找到专业的软件外包开发公司

    今天给大家分享怎么样找软件开发公司开发 而且找到的是既负责又专业的 那怎么去找呢 看哪些方面 北京木奇移动技术有限公司 专业的软件外包开发公司 欢迎交流合作 1 案例看实力 在选择软件定制开发公司时 必须要留意对方的案例如何 有否做过大型的
  • 理解HTTP headers之Expires、Cache-Control、IF-Modified-Since

    一 什么是Http headers 当你在浏览器地址栏里键入一个url 你的浏览器将会类似如下的http请求 GET tutorials other top 20 mysql best practices HTTP 1 1 Host net
  • Hive函数row_number实现

    需求 查询一批用户最后三次登陆时间 ip数据 理解需求是实现分组取前n个值 实现方式是先按照uid字段升序或倒序 时间字段倒序排序数据集合 然后遍历数据集合 用row number函数遍历uid字段 相同则row number值 1 取ro
  • el-table添加border边框线不显示

    el table添加border属性 使用作用域插槽 会不现实左边的边框线 或者右边的边框线 总结问题 1 固定了表格的高度 height 250 把高度去掉
  • JavaScript(函数,作用域和闭包)

    目录 一 什么是函数 1 1 常用系统函数 1 2 函数声明 1 3 函数表达式 二 预解析 2 1 函数自调用 2 2 回调函数 三 变量的作用域 3 1 隐式全局变量 四 作用域与块级作用域 五 作用域链 六 闭包 一 什么是函数 类似
  • 微信小程序:图片高度设置无效问题

    控制台查看元素 显示其style中多了一个没有设置的高度值 找了很久发现是因为image标签设置了mode widthFix 此时高度会自适应 样式中设置高度无效
  • 对接百度api的工具类:Base64Util,FileUtil,HttpUtil

    对接百度api的工具类 Base64Util FileUtil HttpUtil package com baidu ai aip utils Base64 工具类 public class Base64Util private stati
  • Windows中安装GCC教程

    GCC的安装教程 GCC简介 GCC编译器通常在Linux系统下使用 一般来说大部分发行的系统会默认安装 GCC编译器使用gcc指令在终端进行shell操作 对于新接触Linux的朋友来说 简单的在Windows中练习过渡一下应该就足够了
  • Python数据库接口以及API

    非常详细的解释 包含数据库分类以及各种数据库的特点 https wiki python org moin DatabaseInterfaces
  • flex布局详解

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 flex基本概念 任何一个容器都可以指定为Flex布局 例如 box displa
  • 3min利用Python实现9种经典排序算法可视化!(附源代码)

    来源 恋习Python 本文附视频 建议收藏 本文为你分享实现9种经典排序算法可视化的方法 3分钟即可实现 导 读 近在某网站上看到一个视频 是关于排序算法的可视化的 看着挺有意思的 也特别喜感 不知道作者是怎么做的 但是突然很想自己实现一
  • Qt中使用QFrame,并使得边框周围添加阴影的效果

    参考大神博客 https blog csdn net wzz953200463 article details 100533435 1 使用Qframe实现阴影的效果 首先我们需要放置一个frame控件在界面上 2 需要加上头文件 incl
  • 代码文档生成工具:Doxygen

    1 什么是 Doxygen Doxygen是一个程序的文档生成工具 可以将程序中的注释转换成说明文档或者说是API参考手册 同时也支持Markdown等文本工具 从而减少程序员整理文档的时间 程序中的注释需要遵循一定的规则书写 才能让Dox
  • SQL触发器编写与查看

    1 已有数据查看 2 编写触发器 以更新表一为条件 go create trigger TG Insert 创建触发器 on DB TABLE 20210528 定位某张表 for UPDATE 表 DB TABLE 20210528 更新
  • 微信小程序常见面试题

    1 小程序有几个文件 WXML 是框架设计的一套标签语言 结合基础组件 事件系统 可以构建出页面的结构 WXSS 用于描述 WXML 的组件样式 js 逻辑处理 json 小程序页面配置 2 微信小程序与 H5 的区别 运行环境 小程序的运
  • 【ChatGPT进阶】如何使用ChatGPT写小说?

    ChatGPT文本处理能力是毋庸置疑的 可以使用上下文相关的文本来进行自动推理和生成 它可以用来帮助写以更快的速度完成文章 它可以参考上下文 以提供有用的洞察力和见解 它可以大大提高写文章的效率 它可以从上下文中提取关键信息 然后使用这些信
  • WTL 界面设计篇(CSkinEdit)

    头文件声明 CSkinEdit h pragma once include SkinManager h 不支持滚动条皮肤 图片背景支持不完整 Edit控件必须是ES MULTILINE风格 SetMarginsEx才能生效 ES MULTI
  • 【Linux】使用systemd设置开机自启动命令

    目录 1 使用使用systemd实现开机自动运行命令 1 1 新建一个 service文件 1 2 编写 service文件 1 2 1 Unit 1 2 2 Service 1 2 3 Install 1 3 启动服务并设置自启动 2 编