`
wx1569020408
  • 浏览: 26846 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

纠正自己对systemd的一个错误认知

 
阅读更多

以前一直以为,systemd只会到/etc/systemd/system读取配置文件。要enable某个service就是copy service的配置文件到/etc/systemd/system目录下或者建一个symlinks。

昨天,想在启动时自动执行一个程序,自己写了个service文件放到/etc/systemd/system,发现没起作用。

看了一下systemd的手册

http://www.freedesktop.org/software/systemd/man/

其实下面目录都是systemd的读取目录。读取的优先次序是从上到下。

Table 1.  Load path when running in system mode (--system).
/etc/systemd/system/*
/run/systemd/system/*
/usr/lib/systemd/system/*

Table 2.  Load path when running in user mode (--user).                
$XDG_CONFIG_HOME/systemd/user/*
$HOME/.config/systemd/user/*
/etc/systemd/user/*
/run/systemd/user/*
/usr/lib/systemd/user/*

既然上面的目录都是systemd的读取目录,service的enable, disable是怎么回事呢?/usr/lib/systemd/system/下有所有安装的软件的配置,systemd如何来确定需要运行那个unit呢?

systemd的启动项是用unit文件来定义的。首先,每个unit都有Requires,Wants字段配置unit间的依赖关系。除unit文件定义外,每个unit都另外可以有一个配套的.requires/和.wants/ 目录,放到这两个目录里的unit会被隐式作为依赖项。

其次,unit文件里可以定义一个install节,描述该单元WantsBy,或RequiresBy哪个单元。当使用systemctl enable service时,就到WantsBy的单元的.wants目录建一个symlinks过来。类似的,RequiresBy也是这样。

因为/etc/systemd/system优先级最高,/etc/systemd/system目录下建立一些unit的.requires和.wants目录,然后systemctl在/etc/systemd/system对应目录下建立symlinks,就能保证不修改软件的安装文件的情况下,enable service,避免软件包升级时被覆盖。

最后,系统启动时systemd自动读取default.target这个unit,default.target定义了它的Requires和Wants,然后一路按依赖启动各项服务。





转载于:https://my.oschina.net/u/947271/blog/287547

分享到:
评论

相关推荐

    systemd service中文手册

    `systemd.service` 文件是 systemd 管理服务的核心配置文件,它定义了一个被 systemd 监控和控制的进程。本手册是 `systemd.service` 的中文翻译,由金步国翻译并发布,遵循开源精神,允许自由使用和分享,但需保留...

    systemd启动脚本.pdf

    相应地,还有一个 `Before` 字段,定义 sshd.service 应该在哪些服务之前启动。 `Wants` 字段和 `Requires` 字段用于定义服务之间的依赖关系。 `Wants` 字段表示 sshd.service 与 sshd-keygen.service 之间存在"弱...

    最简明的 Systemd 进程管理教程.doc

    Systemd 的配置文件是通过 Unit 来管理的,每个 Unit 都需要有一个配置文件用于告知 systemd 对于服务的管理方式。配置文件的默认后缀名为 .service。配置文件可以分为多个部分,并且区分大小写。 在实战中,我们...

    linux中systemd的源代码(从ubuntu 16.4.4获取)

    Linux中的systemd是一个系统和服务管理器,用于初始化系统,它在Ubuntu 16.4.4及许多其他现代Linux发行版中广泛使用。Systemd的主要目标是提高启动速度,提供更好的服务依赖处理,并统一系统的启动过程。源代码是...

    Python-导出systemd日志到一个外部服务如cloudwatchelasticsearch

    Systemd是Linux系统中广泛使用的初始化系统,它记录了系统的各种操作和服务状态,而Python则作为一种强大的编程语言,常被用于日志处理和自动化任务。本文将详细介绍如何使用Python将systemd日志导出到外部服务,如...

    Python-用Python写一个systemd服务的教程

    在 `/etc/systemd/system` 目录下创建一个名为 `myservice.service` 的文件,内容如下: ```ini [Unit] Description=My Python Service [Service] ExecStart=/usr/bin/python3 /path/to/myservice.py Restart=...

    systemd进程管理

    1. systemd 是内核启动后的第一个用户进程,PID 为 1,是所有其它用户进程的父进程。 2. systemd 支持 SysV init 的后开机启动脚本。 3. systemd 解决了原有模式的缺陷,如原有 service 不会关闭程序产生的子进程。 ...

    Linux Systemd v237 压缩包

    Linux Systemd v237是Linux系统管理守护进程的一个重要版本,它在现代Linux发行版中扮演着核心角色。Systemd作为一个系统初始化系统,负责在系统启动时管理系统服务、网络配置、用户会话等,提高了启动速度和系统...

    如何在 Linux 上从 NetworkManager 切换为 systemd

    对于那些对Systemd抱有积极态度的用户来说,从NetworkManager切换到Systemd-networkd是一个值得考虑的选项。而对于那些偏好传统网络管理工具或者对Systemd持反对意见的用户来说,他们可以继续使用NetworkManager或...

    systemd源码

    systemd的源码,下载解压运行configure脚本进行配置,可能会有些报错,请看报错信息解决,然后就可以编译了,编译后把编译出来的程序替当前linux系统的就好了

    centos7下systemd服务管理全解.doc

    4. 基础依赖关系定义服务控制逻辑:systemd维护一个“事务一致性”的概念,保证所有相关的服务都可以正常启动而不会出现互相依赖,以至于死锁的情况。 在systemd中,unit(单元)是系统管理的基本单位。unit配置...

    LFS-8.2-systemd源码.rar

    LFS-8.2-systemd是LFS项目中的一个版本,该版本引入了systemd作为初始化系统,它极大地改变了传统的Linux启动流程。在本文中,我们将深入探讨systemd的源码,解析其核心概念和工作原理。 1. **systemd概述** ...

    Linux启动程序systemd

    init是内核启动的第一个用户空间进程,主要负责启动、终止系统中的基础服务进程。 Linux下,init主要有三个实现版本: System V,传统的init Upstart,Ubuntu后期针对sys-v的一个改进实现版本 systemd,是一套...

    phddns_3.0_systemd_arm64

    "phddns_3.0_systemd_arm64" 是一个专为arm64架构设计的花生壳(PhDDNS)版本,集成了Systemd服务管理。花生壳是一款知名的动态域名解析服务软件,它允许用户在没有固定公网IP的情况下,通过动态域名来访问自己的...

    PyPI 官网下载 | systemd-0.8.9.tar.gz

    标题中的"PyPI 官网下载 | systemd-0.8.9.tar.gz"指的是Python Package Index(PyPI)上发布的systemd库的一个特定版本,即0.8.9。PyPI是Python开发者发布自己编写的模块和软件的地方,使得其他用户可以方便地下载和...

    systemd.socket按需启动服务实例

    - 可以看到,当有FTP连接时,systemd会自动生成一个新的服务实例,例如`vsftpd@1-192.168.187.158:21-192.168.187.151:54719.service`,这个服务的内容与`vsftpd@.service`相同,但具有唯一的名称。 4. **服务实例...

    puppet-systemd

    系统化概述该模块声明执行资源以创建用于重新加载systemd的全局同步点。 版本2和更高版本的模块不适用于Hiera 3! 您需要将现有的Hiera设置迁移到Hiera 5用法和示例有两种使用此模块的方法。单位文件让此模块处理...

    docker-systemd-unpriv, 非特权systemd容器的Docker 文件.zip

    docker-systemd-unpriv, 非特权systemd容器的Docker 文件 docker-systemd-unpriv基于 CentOS 7的非特权systemd容器的Docker 文件。这里图像旨在作为其他图像的基础。要构建它只需执行 ./build.sh若要运行容器,只需...

    dbus-systemd:一个通过systemd DBus API与systemd交互的板条箱

    `dbus-systemd`项目就是这样一个工具,它是一个用Rust编程语言编写的库,专门设计来利用systemd的DBus API,使得开发者可以更方便地在程序中与systemd进行沟通。 首先,我们要理解Rust语言。Rust是一种系统级编程...

    go-systemd, 转到systemd套接字激活日记D 总线和单元文件的绑定.zip

    go-systemd, 转到systemd套接字激活日记D 总线和单元文件的绑定 systemd 转到systemd绑定。该项目有几个软件包:activation - 用于编写和使用套接字激活dbus - 用于运行服务和单位的starting/stopping/...

Global site tag (gtag.js) - Google Analytics