systemd的unit配置文件详解

news2025/2/22 12:27:14

Systemd 是 Linux 的系统和服务的管理器,兼容 SysV 和 LSB初始化脚本,Systemd有以下特性:

  • 积极的并行化能力
  • 使用套接字和 D-Bus 激活来启动服务
  • 提供按需启动守护进程,使用 Linux cgroups 跟踪进程
  • 支持系统状态的快照和恢复
  • 维护挂载和自动挂载点
  • 实现精心设计的基于事务依赖的服务控制逻辑

systemctl 命令是管理 systemd 的主要工具,它将 SysVinit service 和 chkconfig 命令的功能结合到一个工具中,您可以使用它来永久启用和禁用服务或仅针对当前会话启用和禁用服务

unit类型

Systemd 管理 unit,它们是系统资源和服务的表示,以下列表显示了 systemd 可以管理的 unit 类型:

  • service 系统上的一项服务,包括启动、重新启动和停止服务
  • socket 与服务关联的网络套接字
  • device 使用 systemd 专门管理的设备
  • mount 由 systemd 管理的挂载点
  • automount 启动时自动挂载的挂载点
  • swap 交换系统上的空间
  • target 其它 unit 的同步点,通常用于在启动时启动启用的服务
  • path 基于路径激活的路径。例如,您可以根据某条路径的状态(例如是否存在)来启动服务
  • timer 用于安排激活另一个单元的计时器。
  • snapshot 当前 systemd状态的快照。通常用于在对 systemd 进行临时更改后回滚
  • slice 通过 Linux 控制组节点 (cgroups) 限制资源
  • scope 来自 systemd 总线接口的信息。通常用于管理外部系统进程

systemctl常用命令

systemctl start chronyd #启动
systemctl stop chronyd #停止
systemctl restart chronyd #重启
systemctl status chronyd #查看 unit 状态

systemctl enable chronyd #设置 unit 开启启动
systemctl disable chronyd #取消 unit 开机启动
systemctl is-enabled chronyd #查看 unit 是否开机启动

# 重新加载 unit 的配置文件,每次修改了 unit 的配置文件后,需要执行以下命令重新加载 unit 的配置文件
systemctl daemon-reload

systemctl mask chronyd #屏蔽 unit,屏蔽后 unit 无法启动
systemctl unmask chronyd #取消屏蔽

# 更多命令可通过 systemctl --help 或 man systemctl 来查看

unit配置文件

sshd 服务的 unit 配置文件如下所示,主要分为三部分:[Unit]、[Service] 和 [Install]

[root@vm03 ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

[Unit]部分详解

此部分中使用的参数不仅限于 service 类型的 unit,对其它类型 unit 也是通用的,有关这些参数及其说明的完整列表,可运行命令 man systemd.unit 或访问 systemd.unit 中文手册

注意:在 [unit] 块中的每个参数后都可以指定一个以空格分隔的列表

  • Description:当前 unit 的描述
  • Documentation:文档地址,仅接受类型为:http://、https://、file:、info:、man: 的URI
  • Requires:表示本 unit 与其它 unit 之间存在强依赖关系,如果本 unit 被激活,此处列出的 unit 也会被激活,如果其中一个依赖的 unit 无法激活,systemd 都不会启动本 unit
  • Wants:与 Requires 类似,区别在于如果依赖的 unit 启动失败,不影响本 unit 的继续运行
  • After:表示本 unit 应该在某服务之后启动,选项可参考 systemd.special 中文手册
  • Before:表示本 unit 应该在某服务之前启动,After和Before 字段只涉及启动顺序,不涉及依赖关系
  • BindsTo:与 Requires 类似,当指定的 unit 停止时,也会导致本 unit 停止
  • PartOf:与 Requires 类似,当指定的 unit 停止或重启时,也会导致本 unit 停止或重启
  • Conflicts:如果指定的 unit 正在运行,将导致本 unit 无法运行
  • OnFailure:当本 unit 进入故障状态时,激活指定的 unit

[Service]部分详解

service专有参数

只有 service 类型的 unit 才有这些参数,参数完整列表请访问 systemd.service 中文手册 或 systemd.service

  • simple(默认值):服务为主进程启动,systemd 认为该服务将立即启动,服务进程不会 fork ,如果该服务要启动其他服务,则不要使用此类型启动,除非该服务是 socket 激活型。
  • forking:服务将以fork分叉的方式启动,此时父进程将会退出,子进程将成为主进程。systemd 认为当该服务进程 fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon)除非你确定此启动方式无法满足需求,否则使用此类型启动即可。使用此启动类型应同时指定 PIDFile= 以便 systemd 能够跟踪服务的主进程
  • oneshot:类似于simple,但只执行一次,Systemd会等它执行完,才启动其它服务。这一选项适用于只执行一项任务,随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态
  • dbus:类似于simple,但会等待D-Bus信号后启动。当指定的 BusName 出现在DBus系统总线上时,systemd 认为服务就绪。
  • notify:类似于simple,启动完毕后会通知 Systemd ,然后继续往下执行
  • idle:类似于simple,但是要等到其它所有任务都执行完,才会启动该服务

RemainAfterExit:一个布尔值,它指定即使服务的所有进程都已退出,也应将服务视为活动的,默认为 no

GuessMainPID:一个布尔值,指定systemd在无法可靠确定服务的主 PID 时是否应该猜测它。除非设置了 Type=forking 并且未设置 PIDFile,否则此选项将被忽略,默认为 yes

PIDFile:指向此守护进程的 PID 文件的绝对文件名。对于 Type=forking 的服务,建议使用此选项。Systemd 在服务启动后读取守护进程的主进程的 PID。Systemd 不会写入此处配置的文件,但它会在服务关闭后删除该文件

BusName:到达此服务的 D-Bus 总线名称。对于 Type=dbus 的服务,此选项是必需的

ExecStart:服务启动时执行的命令和参数

ExecStartPre: 服务启动之前执行的命令

ExecStartPost: 服务启动之后执行的命令

ExecReload:重启服务时执行的命令

ExecStop:服务停止时执行的命令和参数

ExecStopPost:服务停止之后执行的命令

RestartSec:重新启动服务前的睡眠时间(以秒为单位)

TimeoutStartSec:等待服务启动的时间(以秒为单位)

TimeoutStopSec:等待服务停止的时间(以秒为单位)

TimeoutSec:同时配置TimeoutStartSec和TimeOutshopSec的缩写

Restart:配置当服务的进程退出、被杀死或达到超时时是否重新启动服务,可以设置的值如下:

  • no 服务将不会重新启动,这是默认设置
  • on-success 仅当服务进程完全退出时重新启动(退出代码0)
  • on-failure 仅在服务进程异常退出时重启,所谓“异常退出”是指:退出码不为"0"
  • on-abnormal 如果进程因信号或超时而终止时重新启动
  • on-watchdog 当看门狗超时而重新启动
  • on-abort 如果进程由于未指定为干净退出状态的未捕获信号而退出,则重新启动
  • always 总是重新启动

Environment:指定环境变量

KillMode:定义systemd如何停止服务,可以设置的值如下:

  • control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
  • process:只杀主进程
  • mixed:主进程将收到SIGTERM信号,子进程收到SIGKILL信号
  • none:没有进程会被杀掉,只是执行服务的stop命令

进程执行环境

下面列出了 service, socket, mount, swap 单元所共有的、 用于定义进程执行环境的配置选项,完整参数说明可运行命令 man systemd.exec 或访问 systemd.exec 中文手册

WorkingDirectory:设置进程的工作目录

User=, Group:设置进程在执行时使用的用户与组,既可以设为一个数字形式的 UID/GID 也可以设为一个字符串形式的名称

NoNewPrivileges:接收一个布尔值。设为 yes 表示该服务的所有进程与子进程都不能通过 execve() 调用获得任何新权限。该选项是最简单也是最有效的防止进程提升权限的方法

SELinuxContext:设置进程的 SELinux 安全上下文

设置进程的各种软/硬资源限制:LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME= 这些指令的值有两种表示法,一个单独的 value 值表示将软硬两种限制设为同一个值。 而冒号分隔的 soft:hard 值表示分别设置软限制与硬限制 (例如 LimitAS=4G:16G),特殊值 infinity 表示没有限制。对于以字节为单位的选项,可以使用以1024为基数的 K, M, G, T, P, E 后缀(例如 LimitAS=16G)。对于时间限制,可以加上 "ms"(毫秒), "s"(秒), "min"(分钟), "h"(小时), "d"(天), "w"(周) 等明确的时间单位后缀

UMask:设置文件创建掩码,默认值为 0022

OOMScoreAdjust:设置进程因内存不足而被杀死的优先级。可设为 -1000(禁止被杀死) 到 1000(最先被杀死)之间的整数值

Environment:设置进程的环境变量, 接受一个空格分隔的 VAR=VALUE 列表。 可以多次使用此选项以增加新的变量或者修改已有的变量(同一个变量以最后一次设置为准)。设为空表示清空先前所有已设置的变量。 注意:(1)不会在字符串内部进行变量展开(也就是"$"没有特殊含义);(2)如果值中包含空格或者等号,那么必须在字符串两边使用双引号(")界定,例如:Environment="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6" 表示设置了 "VAR1", "VAR2", "VAR3" 三个变量,其值分别为 "word1 word2", "word3", "$word 5 6"

EnvironmentFile:与 Environment= 类似,不同之处在于此选项是从文本文件中读取环境变量的设置。文件中的空行以及以分号(;)或井号(#)开头的行会被忽略, 其他行的格式必须符合 VAR=VALUE 的shell变量赋值语法。 行尾的反斜杠(\)将被视为续行符,这与shell语法类似。若想在变量值中包含空格, 则必须在值的两端加上双引号(")界定。文件必须用绝对路径表示(可以包含通配符)。但可在路径前加上 "-" 前缀表示忽略不存在的文件。可以多次使用此选项,以从多个不同的文件中读取设置。若设为空,则表示清空所有先前已经从文件中读取的环境变量。这里列出的文件将在进程启动前的瞬间被读取,因此可以由前一个单元生成配置文件, 再由后一个单元去读取它。从文件中读取的环境变量会覆盖 Environment= 中设置的同名变量。文件的读取顺序就是它们出现在单元文件中的顺序,并且对于同一个变量,以最后读取的文件中的设置为准

UnsetEnvironment:明确撤销该单元的特定环境变量

StandardInput:设置进程的标准输入(STDIN),可设为 null, tty, tty-force, tty-fail, data, file:path, socket, fd:name 之一,此选项的默认值是 null

StandardOutput:设置进程的标准输出(STDOUT),可设为 inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console, file:path, append:path, socket, fd:name 之一

StandardError:设置进程的标准错误(STDERR),取值范围及含义与 StandardOutput= 相同

StandardInputText, StandardInputData:设置通过标准输入(STDIN)传递给进程的任意文本或二进制数据,这些选项仅在 StandardInput=data 时有意义

LogLevelMax:按此日志级别过滤该单元生成的日志消息,可设为一个 syslog 日志级别,也就是 emerg(最低日志级别,仅显示最致命的消息), alert, crit, err, warning, notice, info, debug(最高日志级别,显示最细致的调试消息) 之一

进程环境变量

详细说明访问 systemd.exec 中文手册

$PATH:可执行文件的目录列表(冒号分隔的绝对路径), 此值固定为 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

$LANG:本地化设置。可以通过 locale.conf(5) 文件设置

$USER, $LOGNAME, $HOME, $SHELL:用户名, 用户名, 家目录, 登录shell

$MAINPID:单元主进程的PID (如果能确定的话)

如何杀死进程

service, socket, mount, swap, scope 单元都拥有一组如何杀死进程的配置选项,完整参数说明可运行命令 man systemd.kill 或访问 systemd.kill 中文手册

KillMode:设置在单元停止时,杀死进程的方法。取值范围如:control-group, process, mixed, none 默认值是 control-group 表示杀死该单元的 cgroup 内的所有进程(对于 service 单元,还要先执行 ExecStop= 动作)

KillSignal:设置杀死进程的第一步使用什么信号,所有可用的信号详见 signal(7) 手册。 默认值为 SIGTERM 信号。注意, systemd 会无条件的紧跟此信号之后再发送一个 SIGCONT 信号, 以确保干净的杀死已挂起(suspended)的进程

SendSIGHUP:是否在第一步发送 KillSignal= 信号后,立即紧跟着向该单元的所有进程再发送一个 SIGHUP 信号。这主要用于通知 shell 之类的进程,它们的连接已中断。默认为"no"

SendSIGKILL:是否在超过 TimeoutStopSec= 时间后,使用 SIGKILL 或 FinalKillSignal= 信号杀死依然残存的进程。默认值为"yes"

FinalKillSignal:当发生了超时并且已开启 SendSIGKILL= 时, 发送哪个信号给剩余的进程。应当设置为不能被服务捕获和处理的信号(SIGTERM 就不合适)。对于开发人员来说,可以使用它来生成 coredump 以了解为什么服务在接收到最初的 SIGTERM 信号时没有正确终止。具体做法是设置 LimitCORE= 并且将 FinalKillSignal= 设为 SIGQUIT 或 SIGABRT 之一。此选项的默认值为 SIGKILL

WatchdogSignal:在看门狗(WatchdogSec=)发生超时的情况下,使用哪个信号终止服务。此选项的默认值为 SIGABRT

进程资源控制

slice, scope, service, socket, mount, swap 单元共享一组用于限制进程资源占用的配置选项,本质上,这些选项依赖于Linux内核的 cgroups 功能,将一组进程组织成树形层次结构,并对其允许占用的各种资源进行限制,有关这些参数及其说明的完整列表,可运行命令 man systemd.resource-control 或访问 systemd.resource-control 中文手册

[Install]部分详解

[install] 定义了 unit 的安装信息,此部分配置仅在 systemctl enable 或 systemctl disable 时使用,在 unit 运行时不解释此部分,相当于是配置如何开机启动

此部分中使用的参数不仅限于service类型的unit,对其它类型的 unit也是通用的,有关这些参数及其说明的完整列表,可运行命令 man systemd.unit 或访问 systemd.unit 中文手册

  • Alias:当前 unit 可用于启动的别名,此处列出的名称必须与服务文件名具有相同的后缀(即类型),在执行 systemctl enable 时将创建从这些名称到 unit 文件名的符号链接
  • RequiredBy:表示该服务所在的Target,它的值是一个或多个Target,当 systemctl enable 时 unit 符号链接会放入 /etc/systemd/system 目录下面以 Target名 + .required 后缀构成的子目录中
  • WantedBy:表示该服务所在的Target,它的值是一个或多个Target,当前 systemctl enable 时 unit符号链接会放入 /etc/systemd/system 目录下面以 Target名 + .wants 后缀构成的子目录中
  • Also:当 systemctl enable 或 systemctl disable 时会同时 enable 和 disable 的其它 unit 列表

Target含义

Target的含义是服务组,表示一组服务 WantedBy=multi-user.target 指的是,unit 所在的 Target 是multi-user.target(多用户模式)

这个设置非常重要,因为执行systemctl enable 是会将 unit 链接到 /etc/systemd/system/multi-user.target.wants目录之中,实现开机启动的功能

常见unit配置文件

# nginx的unit 配置文件
cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/run/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /usr/local/nginx/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /usr/local/nginx/run/nginx.pid)"

[Install]
WantedBy=multi-user.target

# redis的unit 配置文件
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
LimitNOFILE=10032
NoNewPrivileges=yes
OOMScoreAdjust=-900
Type=notify
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

# mysql的unit 配置文件
[Unit]
Description=mysql server
Documentation=https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
After=network.target
After=syslog.target

[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/usr/local/mysql/mysqld.pid
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/mysqld.pid $MYSQLD_OPTS
LimitNOFILE=5000
Restart=on-failure

[Install]
WantedBy=multi-user.target

# prometheus的unit 配置文件
[Unit]
Description=prometheus service
Documentation=https://prometheus.io/docs/prometheus/latest/management_api
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
    --config.file=/usr/local/prometheus/prometheus.yml \
    --storage.tsdb.retention.time=92d \
    --storage.tsdb.path=/usr/local/prometheus/data \
    --web.listen-address=0.0.0.0:9090 \
    --web.console.templates=/usr/local/prometheus/consoles \
    --web.console.libraries=/usr/local/prometheus/console_libraries
#如果想要输出日志重定向到文件,可以按如下方式,注意此时就不能使用续行符了
#ExecStart=/bin/bash -ce "/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml >> /var/log/prometheus.log  2>&1"
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

# alertmanager的unit 配置文件
[Unit]
Description=alertmanager service
Documentation=https://prometheus.io/docs/alerting/latest/management_api
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager \
    --config.file=/usr/local/alertmanager/alertmanager.yml \
    --storage.path=/usr/local/alertmanager/data \
    --data.retention=120h \
    --web.listen-address=0.0.0.0:9093
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

# node_exporter的unit配置文件
[Unit]
Description=node_exporter
Documentation=https://github.com/prometheus/node_exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/node_exporter-1.1.2.linux-amd64/node_exporter \
    --web.listen-address=0.0.0.0:9100 \
    --web.telemetry-path=/metrics
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

# redis_exporter的unit配置文件
[Unit]
Description=redis_exporter
Documentation=https://github.com/oliver006/redis_exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/redis_exporter-v1.25.0.linux-amd64/redis_exporter \
    -redis.addr=localhost:6379 \
    -redis.password=123456 \
    -web.listen-address=:9121 \
    -web.telemetry-path=/metrics
Restart=on-failure

[Install]
WantedBy=multi-user.target

# blackbox_exporter的unit配置文件
[Unit]
Description=blackbox_exporter
Documentation=https://github.com/prometheus/blackbox_exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/blackbox_exporter-0.19.0.linux-amd64/blackbox_exporter \
    --web.listen-address=0.0.0.0:9115 \
    --config.file=/usr/local/prometheus_exporter/blackbox_exporter-0.19.0.linux-amd64/blackbox.yml
ExecStop=/bin/kill -s TERM $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

# mysqld_exporter的unit配置文件
[Unit]
Description=mysql_exporter
Documentation=https://github.com/prometheus/mysqld_exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/mysqld_exporter-0.13.0.linux-amd64/mysqld_exporter \
    --config.my-cnf=/usr/local/prometheus_exporter/mysqld_exporter-0.13.0.linux-amd64/.my.cnf \
    --web.listen-address=:9104 \
    --web.telemetry-path=/metrics
Restart=on-failure

[Install]
WantedBy=multi-user.target

# systemd管理java进程
[Unit]
Description=question_api
Documentation=https://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html
After=network.target

[Service]
Type=forking
SuccessExitStatus=143
ExecStart=/bin/sh -c "/usr/local/java/jdk1.8.0_201/bin/java -Xms2048m -Xmx2048m -jar /app/question_api/question_api_beta.jar --server.port=8080 >> /var/log/app/question_api.log 2>&1 &"
ExecStop=/bin/kill -s TERM $MAINPID

Restart=on-failure

[Install]
WantedBy=multi-user.target

# 配置项 SuccessExitStatus=143 是为了抑制stop时报错 Main process exited, code=exited, status=143/n/a
# 这是因为 java 程序在响应 SIGTERM 时不会并不会发回预期的退出状态
# 所以需要将退出代码 SuccessExitStatus=143 添加到 systemd 服务文件作为成功退出状态来抑制这种报错

 

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

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

相关文章

艾美捷Cas9核酸酶应用说明及实例展示

Product Description:Recombinant Streptococcus pyogenes Cas9 (wt) protein expressed in an E. coli . Form:Liquid Preparation Method:E. coli expression system Purity:≥ 95% by SDS-PAGE Activity:20 nM CRISPR/Cas9-C-NLS nuclease incubated for 1 hour at 37℃…

【新知实验室 TRTCIM】实时互动课堂最佳实践

【新知实验室 TRTC&IM】实时互动课堂最佳实践一、新知实验室-TRTC腾讯云音视频产品体验官计划活动简介二、产品简介TRTCIM三、最佳实践3.1 官方快速上手TRTC(快速跑通)3.1.1 注册腾讯云账号3.1.2 使用实时音视频(需先开通)3.1.3 创建应用3.1.4 查看项目(查看密钥和快速上手…

java基础—String

我们都知道 创建一个字符串最简单的方式是 String meaasge "java资讯";当然还可以用构造来创建 (不推荐,开发中不要用) String str2new String("java资讯");这两种创建最主要的区别在于,一个在公共池中&…

gitlab CI/CD 自动化部署vue项目到阿里云服务器步骤

目录1,gitlab托管vue项目2,本地项目连接到远程仓库3,设置gitlab-runner4,编写yml文件5,部署到阿里云服务器(本地设置)5.1 安装相关依赖5.2 vue项目中添加deploy.js文件5.3 注册deploy命令5.4 验…

文本生成图像工作简述2--常用数据集分析与汇总

文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。用户可以输入他们喜欢的任何文字提示——比如,“一只可爱的柯基犬住在一个用寿司做的房子里”——然后,人工智能就像施了魔法一样,会产生相应的图像。 文本生成图像(te…

实验2:Arduino的nRF24L01双向收发实验

实验结果: 00节点向01发送:00ReqMesFor01 01节点向00发送:CodeNewNiceBoy 并且在串口打印出相应信息 硬件电路: 01 软件 00节点代码: /*00 */#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(9, 10);// CE, CSNconst char te…

dolphinscheduler 2.0.5 性能手动测试

目录&#x1f42c;官方配置文件说明&#x1f42c;测试并发量&#x1f420;线程数量设置100&#x1f420;线程数量设置200&#x1f420;线程数量设置500&#x1f42c;测试结论&#x1f42c;官方配置文件说明 官方说明 master.exec.threads&#xff1a; master工作线程数量,用于…

智能晾衣架(二)--功能实现

本文素材来源于红河学院 工学院 作者&#xff1a;赵德森 张艺锦 潘志慧 曹紫康 指导老师&#xff1a;江洁 张龙超 1. 自动升降功能 我们设计时采用了热释电传感器&#xff08;人体红外传感器&#xff09;&#xff0c;在热释电传感器感应到有人靠近时&#xff0c;晾衣架通…

C++:内存管理:C++内存管理详解(二):带你攻破内存管理

前言&#xff1a; 任何程序运行起来都需要分配内存空间存放该进程的资源信息&#xff0c;C程序也不例外。C程序中的变量、常量、函数、代码等等信息所存放的区域都有所不同&#xff0c;不同的区域又有不同的特性。 欺骗C进程 每一个C语言的程序被执行起来的时候系统为了方便开…

字符串的简单介绍和字符串的大小比较

以前就写过一篇关于String的文章&#xff0c;今天再来写一篇&#xff0c;更加深入了解一下String类 &#x1f550;1.String类的定义 &#x1f551;2.String类的创建 &#x1f552;3.字符串的大小比较 1.之前在C语言中我们已经学到了字符类型&#xff0c;但是C语言没有Strin…

Oracle-Rman duplicate文件坏块问题处理ORA-19849 19612

前言: 最近&#xff0c;在使用rman duplicate进行备库环境搭建时&#xff0c;遇到了ORA-19849 19612坏块报错&#xff0c;最终分析是发现由于网络的配置导致。 问题: 在 ORACLE 12.2.0.1.180417 通过RMAN duplicate进行备库初始化&#xff0c;在复制文件的过程中&#xff0c;…

FTP服务器移植到Linux开发板

FTP服务器移植到Linux开发板 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录FTP服务器移植到Linux开发板前言一、vsftpd源码下载二、vsftpd移植及配置1.vsftpd移植2.vsftpd配置2.1 配置vsftpd.conf2.2 添加新用户2…

LVS+Keepalived群集

目录 一.keeepalived工具介绍 1.1 专为LVS和HA设计的一款健康检查工具 1.2 Keepalived实现原理剖析 1.3 VRRP工作过程 1.4 Keepalived&#xff0c;VRRP及其工作原理 1.5 Keepalived体系主要模块及其作用 二、LVSKeepalived 高可用群集的搭建步骤 1、配置负载调度器&…

项目管理(PMO的作用)

项目管理办公室 (PMO) 是对与项目相关的治理过程进行标准化&#xff0c;并促进资源、方法论、工具和技 术共享的一个组织结构。PMO 的职责范围可大可小&#xff0c;从提供项目管理支持服务&#xff0c;到直接管理一个 或多个项目。 PMO的三种类型&#xff1a; PMO的作用&#…

ppt背景图片怎么设置?6步教你快速搞定!

在制作 ppt的过程中&#xff0c;需要将一些内容进行设置&#xff0c;来保证整体美观&#xff0c;也就是将背景图片设置好。背景图片设置的好&#xff0c;可以很好地体现页面上的内容&#xff0c;提高页面上的内容展示效果。所以大家在制作 ppt时&#xff0c;需要将一些背景图片…

进程和线程详解

目录 前言&#xff1a; 操作系统定位 并发 并行 并发 进程 描述 PCB 管理 内存管理 进程间通信 线程 小结&#xff1a; 前言&#xff1a; 当一个程序运行起来时&#xff0c;操作系统要为之分配一些资源&#xff0c;这样的运行起来的程序称之为一个进程。为了有效解…

huffman编译码

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 利用哈夫曼编码进行信息通信可以较大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对…

Python期末复习题:文件

Python期末复习题&#xff1a;文件 文章目录Python期末复习题&#xff1a;文件一、二手房数据统计二、学生成绩统计一、二手房数据统计 附件文件house.csv 中存储一些二手房数据&#xff0c;中文编码为GBK&#xff0c;对文件中的数据进行统计分析。 文件中数据格式如下所示&…

理解Attention机制的query key value

背景 在Attention机制引入前&#xff0c;自然语言处理里的深度学习模型有以下缺点&#xff1a; 长序列的推理存在信息损失/梯度消失&#xff1a;输入序列越长&#xff0c;模型越难保存初始输入信息。运算量大并且不能并行&#xff1a;RNN的每一步推理都是基于上一个步的结果。…

Python小游戏自己动手编写,你能写出几个(分享版)

今天分享一个有趣的Python游戏库freegames&#xff0c;它里面包含经典小游戏&#xff0c;像贪吃蛇、吃豆人、等等。可以通过1行代码重温这些童年小游戏&#xff0c;后面还会分享源码&#xff0c;可以自己学习游戏编写&#xff0c;相信你会超有成就感&#xff01; Paint 涂鸦 在…