Linux:systemd进程管理【1】

整体理解

要快速掌握Linux的systemd并覆盖80%的使用场景,以下是最重要的20%知识点:

  1. Systemd简介与核心功能

    • Systemd是一个系统和服务管理器,作为Linux系统的PID 1进程,负责启动和管理其他系统组件。
    • 它提供并行启动服务的能力,显著加快系统启动时间。
    • Systemd使用socket和D-Bus激活服务,按需启动守护进程,并跟踪使用Linux控制组的进程。
    • 它还维护挂载和自动挂载点,实现基于依赖的服务控制逻辑,并支持SysV和LSB init脚本。
  2. 核心组件

    • systemctl:Systemd的主命令行工具,用于控制服务和系统状态。
    • systemd-journald:负责日志数据的收集和存储。
    • systemd-analyze:用于分析系统启动性能和诊断性能问题。
    • systemd-tmpfiles:创建、删除、清理临时和易失文件。
  3. 服务管理

    • 服务是systemd中代表后台进程或守护进程的单元,通过systemctl命令管理服务的启动、停止、重启和状态检查。
  4. 日志管理

    • Systemd集成了journald日志系统,提供了统一的日志管理解决方案,可以通过journalctl命令进行日志查询。
  5. 依赖管理和并行化处理

    • Systemd自动处理服务间的依赖关系,并并行启动服务,加快系统启动。
  6. 配置文件格式

    • Systemd使用unit文件(如.service)来·管理服务配置,这些文件位于/etc/systemd/system/lib/systemd/system目录下。
  7. 系统启动和目标

    • Systemd支持多个运行级别(targets),如multi-user.targetgraphical.target,用于定义不同的系统启动状态。
  8. 网络管理

    • systemd-networkd用于网络接口的设置和管理,而systemd-resolved提供网络名称解析服务。

掌握这些核心概念和工具,你将能够有效地管理和优化Linux系统上的服务和资源。

unit概念的理解

要快速掌握systemd中的unit并覆盖80%的使用场景,以下是最重要的20%知识点:

  1. Unit的概念

    • Unit是systemd管理系统资源的基本单元,每个系统资源就是一个Unit,并使用一个Unit文件定义。
  2. Unit的类型

    • Service unit(.service):用于定义系统服务。
    • Target unit(.target):用于模拟实现“运行级别”。
    • Device unit(.device):用于定义内核识别的设备。
    • Mount unit(.mount):定义文件系统挂载点。
    • Socket unit(.socket):用于标识进程间通信用到的socket文件。
    • Snapshot unit(.snapshot):管理系统快照。
    • Swap unit(.swap):用于标识swap设备。
    • Automount unit(.automount):定义文件系统自动挂载点。
    • Path unit(.path):用于定义文件系统中的一个文件或目录。
  3. Unit文件结构

    • Unit文件通常包含三个配置区段:Unit和Install段(所有Unit文件通用),Service段(仅服务类型的Unit文件特有)。
    • Unit段包含服务的描述、依赖等信息,如DescriptionAfterRequires等。
    • Service段包含服务的具体管理和操作方法,如ExecStartExecStop等。
    • Install段定义了Unit如何随系统启动,如WantedBy指定启动目标。
  4. Unit文件的位置

    • Unit文件通常位于/etc/systemd/system/run/systemd/system/usr/lib/systemd/system三个目录中,其中/etc/systemd/system中的文件具有最高优先级。
  5. 管理Unit的命令

    • systemctl start|stop|restart|reload <unit>:启动、停止、重启、重载服务。
    • systemctl enable|disable <unit>:设置服务开机自启或不自启。
    • systemctl status <unit>:查看服务状态。
    • systemctl list-units:列出所有已加载的units。

掌握这些核心概念和操作,你将能够有效地管理和配置Linux系统中的systemd units。

UNIT示例

编写一个systemd service unit文件需要遵循一定的格式和包含必要的指令。下面是一个基本的systemd service unit文件的编写步骤和示例:

1. 确定文件位置和名称

通常,自定义的service unit文件应该放在/etc/systemd/system/目录下。文件名通常以.service结尾,例如myapp.service

2. 编写Unit文件

一个典型的systemd service unit文件包含三个部分:[Unit]、[Service]和[Install]。以下是每个部分的基本指令和说明:

[Unit] 部分
  • Description:服务的描述。
  • After:指定服务启动的顺序,依赖于哪些服务。
  • Requires:指定服务必须依赖的服务,如果这些服务失败,则当前服务也会失败。
  • Wants:指定服务希望启动的服务,但不是必需的。
[Service] 部分
  • Type:服务类型,如simpleforkingoneshot等。
  • ExecStart:启动服务时执行的命令。
  • ExecStop:停止服务时执行的命令(可选)。
  • Restart:服务失败时的重启策略,如on-failure
  • User:运行服务的用户。
  • WorkingDirectory:服务的工作目录。
[Install] 部分
  • WantedBy:指定服务应该被哪些target依赖,通常是multi-user.targetgraphical.target

3. 示例

下面是一个简单的systemd service unit文件示例,它定义了一个名为myapp.service的服务:

[Unit]
Description=My Custom Application Service
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=on-failure
User=myappuser
WorkingDirectory=/home/myappuser[Install]
WantedBy=multi-user.target

4. 启用和启动服务

编写完unit文件后,你需要执行以下命令来启用服务,并在系统启动时自动启动:

sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
  • systemctl daemon-reload:重新加载systemd的配置文件,使新添加的unit文件生效。
  • systemctl enable myapp.service:将服务设置为开机自启。
  • systemctl start myapp.service:启动服务。

5. 检查服务状态

使用以下命令检查服务的状态:

sudo systemctl status myapp.service

通过遵循这些步骤,你可以创建自己的systemd service unit文件,并管理自定义服务。

守护进程

守护进程(Daemon)是Linux系统中的一种后台运行的特殊进程,通常用于提供持续的服务或等待处理某些请求。以下是掌握守护进程最重要的20%知识点,帮助你快速学习并覆盖80%的使用场景:

  1. 守护进程的定义和作用

    • 守护进程是一种在后台运行的进程,不与任何终端相关联,通常用于执行特定的系统任务或服务。
  2. 守护进程的特点

    • 它们通常在系统启动时启动,并一直运行直到系统关闭。
    • 守护进程通常在后台运行,不与用户直接交互。
    • 它们通常被设计为长时间运行,并且能够处理多个请求。
  3. 常见的守护进程

    • sshd:提供SSH服务,允许远程登录。
    • httpdnginx:提供Web服务。
    • crond:定时执行任务。
    • syslogd:日志系统服务。
  4. 守护进程的启动方式

    • 守护进程可以通过init系统(如System V init)、systemdUpstart等系统和服务管理器启动。
    • 它们也可以通过配置文件(如/etc/init.d/下的脚本)启动。
  5. 守护进程的进程管理

    • 守护进程通常在/var/run目录下创建一个PID文件,记录其进程ID。
    • 使用pstophtop命令可以查看守护进程的状态。
  6. 守护进程的日志记录

    • 守护进程通常将日志发送到syslog或直接写入到特定的日志文件中。
  7. 守护进程的配置文件

    • 守护进程的配置文件通常位于/etc目录下,例如/etc/httpd/conf/httpd.conf
  8. 守护进程的安全性

    • 守护进程需要正确配置权限,以防止未授权访问。
    • 使用防火墙和安全策略来保护守护进程。
  9. 守护进程的调试

    • 使用strace跟踪系统调用,帮助调试守护进程。
    • 查看守护进程的日志文件以诊断问题。
  10. 守护进程的监控和维护

    • 使用systemctlservice命令管理守护进程的启动、停止和重启。
    • 定期检查守护进程的状态和日志,确保其正常运行。

掌握这些关键知识点,你将能够理解和管理Linux系统中的守护进程,以及如何配置和维护它们以提供持续的服务。

unit的service中service部分type类型

在systemd的unit文件中,Service部分的Type指令定义了服务的启动类型,这对于服务的行为至关重要。以下是Type指令最重要的20%知识点,帮助你快速掌握并覆盖80%的使用场景:

  1. simple

    • 这是默认的类型,适用于大多数服务。ExecStart指定的命令会直接启动服务,systemd会监控其主进程。
  2. forking

    • 适用于传统的Unix服务,这些服务会fork出一个子进程来运行实际的服务,而父进程会立即退出。systemd需要知道服务已经forked,因此需要在服务启动后发送一个SIGTERM信号来通知systemd
  3. oneshot

    • 用于那些只执行一次的服务,比如某些初始化脚本。systemd会在ExecStart命令执行完成后立即认为服务已经启动。
  4. dbus

    • 用于依赖于D-Bus的服务。systemd会等待D-Bus上指定的名字出现后才认为服务已经启动。
  5. notify

    • 类似于simple,但是服务需要在启动后发送一个通知信号给systemd,告知它已经准备好接收请求。
  6. idle

    • 服务只有在系统中没有其他任务执行时才会运行。
  7. background

    • 类似于simple,但是systemd会立即返回,不会等待服务的启动。
  8. foreground

    • 服务必须保持在前台运行,类似于simple,但是systemd会等待服务的控制终端变为前台进程。

了解这些Type类型及其适用场景,可以帮助你正确配置systemd服务,确保服务按照预期行为启动和运行。每种类型都有其特定的用途和配置要求,正确选择和配置Type对于服务的稳定性和可靠性至关重要。

sigterm信号

要快速掌握SIGTERM信号的80%使用场景,以下是最重要的20%知识点:

  1. SIGTERM的定义

    • SIGTERM(Signal Termination)信号是一个请求进程终止的信号。它是kill命令的默认信号,用于告诉进程优雅地结束。
  2. SIGTERM的作用

    • SIGTERM允许进程有机会执行清理操作,如关闭文件描述符、释放资源和保存状态,然后退出。
  3. SIGTERM与SIGKILL的区别

    • SIGKILL不同,SIGTERM是可以被捕获和处理的,允许进程有机会执行清理操作。SIGKILL是不能被捕获的,用于立即终止进程。
  4. SIGTERM的默认行为

    • 如果进程没有处理SIGTERM信号,其默认行为是终止进程,但不会生成core dump文件。
  5. 处理SIGTERM信号

    • 进程可以通过定义信号处理函数来响应SIGTERM信号,执行特定的清理代码后退出。
  6. 优雅关闭服务

    • 在许多Unix系统中,init在关闭电源前会向所有不重要的进程发送SIGTERM,等待几秒后,再发送SIGKILL以强制终止剩余进程。
  7. 编程中的SIGTERM处理

    • 在C/C++中,可以使用signal()sigaction()函数来设置SIGTERM的信号处理函数,例如:signal(SIGTERM, handler_function);
  8. 守护进程中的SIGTERM

    • 守护进程通常会捕获SIGTERM信号以优雅地关闭服务,执行必要的清理工作。

掌握这些关键点,你将能够理解SIGTERM信号的重要性以及如何在实际应用中处理它,确保进程能够优雅地终止并进行适当的资源清理。

Linux信号

SIGTERM
中文名一般叫“终止信号”,用于终止进程。
SIGTERM最常见的一个应用场景是,执行命令 kill ,该命令会终止进程号为PID的进程。注意,这里kill没有-9之类的额外参数。
进程捕捉到SIGTERM信号后,通常会做些善后工作然后退出,这个过程通常被叫做“优雅退出”。当然,进程也可以不做任何处理,忽略该信号,继续运行下去。信号可能被忽略了,这就是为啥有时候kill 根本不起作用。
除了kill命令,SIGTERM还有很多其他使用场景。比如,docker stop、supervisorctl stop背后的实现机制就是给进程发送SIGTERM信号。

SIGKILL
SIGKILL,名字明显比SIGTERM霸气,字面意思就是“杀死”进程。最常见的应用场景就是大名鼎鼎的kill -9 命令。
SIGKILL最大的特点是,被杀的进程根本无法捕获处理该信号,操作系统会负责直接杀掉进程,进程没有任何反抗的余地。这个大杀器效果立竿见影,但是也有副作用,就是经常来不及做任何善后工作,可能引起数据丢失等问题。比如说,一个进程可能会把接收到的数据先临时放到内存里,攒到若干MB后再一次性写入磁盘,从而避免频繁的磁盘IO操作(比如迅雷就是这么干的),如果进程被突然杀掉,那么它根本来不及把内存里的数据写入磁盘,进而导致这些数据丢失。

SIGINT
SIGINT的字面意思是“打断”,和SIGTERM类似,区别在于,该信号通常被用于前台进程(可以简单理解为可以在shell上长期存在,不会后台运行的程序)。
当我们使用命令行程序时,按下CTRL + C时,进程便会收到SIGINT信号。一般进程会捕获处理这个命令并退出。当然,跟处理SIGTERM信号一样,进程也可以选择忽略信号并继续运行。

systemd中环境变量的问题

在处理systemd服务中的环境变量问题时,以下是最重要的20%知识点,可以帮助你快速理解和解决大部分问题:

  1. 使用Environment指令设置环境变量
    在systemd的服务文件中,可以通过Environment指令直接设置环境变量。例如:

    [Service]
    Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    

    这样设置后,指定的变量将在服务启动时被设置。

  2. 使用EnvironmentFile导入环境变量文件
    如果你有多个环境变量需要设置,可以使用EnvironmentFile指令指向一个包含环境变量的文件。该文件中的每行格式为VarName=VarValue。例如:

    [Service]
    EnvironmentFile=/etc/test_env_service/var_file
    

    其中/etc/test_env_service/var_file文件包含:

    FILE_VAR1="Variable 1 from environment file"
    FILE_VAR2="Variable 2 from environment file"
    

    这样,文件中的变量将被导入到服务的环境中。

  3. 通过脚本来设置环境并启动服务
    另一种方法是编写一个包装脚本,在该脚本中设置所需的环境变量,然后启动服务。例如:

    #!/bin/bash
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    exec /path/to/your/service
    

    然后在systemd服务文件中引用这个脚本:

    [Service]
    ExecStart=/path/to/start-service.sh
    

    这样,当systemd启动服务时,实际上是启动了这个脚本。

  4. 理解systemd服务中的环境变量限制
    systemd启动的服务通常不会加载用户的环境变量,尤其是/etc/profile下的环境变量。因此,你需要在服务文件中明确设置所需的环境变量。

  5. 使用systemctl edit进行配置覆盖
    为了避免修改原始的服务文件,可以使用systemctl edit <servicename>命令创建一个override文件,在其中设置环境变量。例如:

    [Service]
    Environment="Foo=bar"
    

    这将在/etc/systemd/system/<servicename>.service.d/目录下创建一个override.conf文件,其中的设置将覆盖原始服务文件中的设置。

掌握这些关键点,你将能够有效地管理和解决systemd服务中的环境变量问题。


总结:
1、systemd是一个用来编写系统后台服务的工具
2、Unit是其服务单元,通常由.service文件,当然也有不同的服务类型
3、unit的文件分为几个段,来描述启动和停止命令,依赖等
4、systemctl status xx,xx是service的名字,来查看service的状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server管理员sa登录失败原因

文章目录 一、开启混合登录模式二、启用sa三、更改密码四、登录sa一、开启混合登录模式 用Windows身份登录数据库服务。 在连接名上右键→属性。 在安全性选项卡下,选择【SQL Server和Windows身份验证模式】,点击【确定】,提示需要重启服务。 Win+R,输入指令:services.ms…

logminer挖掘日志归档查找问题

--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…

如何监控Elasticsearch集群状态?

大家好&#xff0c;我是锋哥。今天分享关于【如何监控Elasticsearch集群状态&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何监控Elasticsearch集群状态&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 监控 Elasticsearch 集群的状态对于确保…

C# 集合(Collection)

文章目录 前言一、动态数组&#xff08;ArrayList&#xff09;二、哈希表&#xff08;Hashtable&#xff09;三、排序列表&#xff08;SortedList&#xff09;四、堆栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、点阵列&#xff08;BitArray&…

TypeScript 迭代器与装饰器

TypeScript 作为 JavaScript 的一个超集&#xff0c;提供了许多高级特性来增强代码的可读性、可维护性和类型安全性。在本文中&#xff0c;我们将探讨两个这样的特性&#xff1a;迭代器和装饰器。迭代器允许我们以一致的方式遍历数据集合&#xff0c;而装饰器则提供了一种特殊的…

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序&#xff0c;并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志&#xff0c;或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期&#xff0c;我们提供静态 html 文件。然后我们提供动态渲染的 h…

flutter in_app_purchase google支付 PG-GEMF-01错误

问题&#xff1a;PG-GEMF-01错误 flutter 使用in_app_purchase插件升降级订阅时报错PG-GEMF-01。 解决方案&#xff1a; 升降级订阅时&#xff0c;确保不调用 MethodCallHandlerImpl.java文件中的 setObfuscatedAccountId()方法、setObfuscatedProfileId()方法 原因&#xf…

Docker 容器隔离关键技术:Capabilities

Docker 容器隔离关键技术&#xff1a;Capabilities 在 Docker 中&#xff0c;Capabilities 是一种权限管理技术&#xff0c;它将 Linux 系统中传统的超级用户&#xff08;root&#xff09;权限拆分为多个独立的小权限&#xff08;目前为 38 项&#xff09;。这使得我们可以为容…

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录&#xff0c;有别于基础语法&#xff0c;很多内容只要求会用就行&#xff0c;无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout&#xff1a; 1.3 string以下是字符串的一些简介&#xff1a;字符串…

【Redis】Redis介绍

目录 1.Redis是什么? 2. Redis特性 2.1 速度快 2.2 基于键值对的数据结构服务器 2.3 丰富的功能 2.4 简单稳定 2.5 客户端语言多 2.6 持久化 2.7 主从复制 2.8 高可用和分布式 3. Redis使用场景 3.1 缓存(Cache) 3.2 排行榜系统 3.3 计数器应用 3.4 社交网络 …

Redis使用场景-缓存-缓存穿透

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存穿透&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…

STM32 ADC --- 多通道序列采样

STM32 ADC — 序列通道采样 文章目录 STM32 ADC --- 序列通道采样CubeMX配置代码编写总结 CubeMX配置 使用cubeMX生成HAL工程 扫描模式在配置多个通道时会自动变为Enable&#xff0c;这里需要注意的是需要将连续转换模式配置为Disable&#xff0c;将结束转换选择选择为每个通道…

树莓派2安装jupyterlab以便更好的编程体验

树莓派2 是一款很老的开发板了&#xff0c;但是它还能继续战斗。为了更好的编程体验&#xff0c;准备安装jupyterlab 安装jupyterlab 使用命令&#xff1a; pip install jupyterlab 该过程非常漫长&#xff0c;因为树莓派2是很老的板子&#xff0c;它需要安装一些arm7版本的…

C语言数据结构——详细讲解《队列》

C语言数据结构——详细讲解《队列》 前言一、队列的概念二、队列的操作&#xff08;一&#xff09;定义队列结构&#xff08;二&#xff09;初始化队列&#xff08;三&#xff09;入队列操作&#xff08;四&#xff09;出队列操作&#xff08;五&#xff09;获取队头元素&#…

【游资悟道】-作手新一悟道心法

作手新一经典语录节选&#xff1a; 乔帮主传完整版&#xff1a;做股票5年&#xff0c;炼成18式&#xff0c;成为A股低吸大神&#xff01;从小白到大神&#xff0c;散户炒股的六个过程&#xff0c;不看不知道自己水平 围着主线做&#xff0c;多研究龙头&#xff0c;研究涨停&am…

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…

使用pymupdf提取PDF文档中的文字和其颜色

最近我在捣鼓一个PDF文件&#xff0c;想把它里面的文字和文字颜色给提取出来。后来发现有个叫pymupdf的库能搞定这事儿。操作起来挺简单的&#xff0c;pymupdf的示例文档里就有现成的代码可以参考。 how-to-extract-text-with-color 我本地的测试代码如下&#xff1a; impor…

Java 中的栈、队列

Java 中的栈、队列和双端队列 Java 提供了多种类和接口支持栈、队列和双端队列的实现。 Stack \texttt{Stack}Stack 类是早期版本的栈的实现类&#xff0c;继承自 Vector \texttt{Vector}Vector 类。在后续版本中&#xff0c;JDK 的官方文档不建议使用 Stack \texttt{Stack}St…

《企业级低代码开发平台技术要求》核心要点解析

一、引言 在数字化转型的浪潮中&#xff0c;企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》&#xff08;T/SZAS 77—2024&#xff09;为该领域提供了重要的规范与指引。深入剖析其核心要点&#xff0c;对于理…

STM32 + CubeMX + 串口 + IAP升级

这篇文章分享一个简单的串口IAP Demo&#xff0c;实现使用串口更新我们自己的App程序。 目录 一、IAP简介二、Stm32CubeMx配置三、Boot代码及配置1、代码2、配置 四、App代码及配置1、代码2、配置 五、效果展示 一、IAP简介 IAP介绍可以在网上找找&#xff0c;相关资料很多&am…