news 2026/9/5 20:34:20

Rocky Linux部署Hermes Agent与Web-UI实战:安装、避坑与调优

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rocky Linux部署Hermes Agent与Web-UI实战:安装、避坑与调优

1. 先说清楚:为什么是 Rocky Linux,为什么要装 Hermes Agent

很多朋友第一次接触 Hermes Agent 和 Hermes-Web-UI,都是听同事推荐或者逛开源社区时看到的。我最初也是抱着“试试看”的心态在虚拟机里折腾,结果一路装下来发现坑并不少。为了避免大家走了弯路,这篇就把我完整跑通的安装过程、踩坑记录和最终调优经验都整理出来。

先给没接触过的朋友解释一下这两个东西是什么。Hermes Agent 是一个轻量级的设备管理/监控代理端,它在你需要纳管的服务器上运行,负责采集主机的运行状态、执行指令、同步配置、对接上层的管理平台;而 Hermes-Web-UI 则是配套的 Web 控制台,用来统一查看所有 Agent 上报的数据,在网页上管理设备、下发任务、查看告警和日志。简单来说,一个管“端”,一个管“面”,两者配合起来就构成了一套完整的服务器集群管理闭环。它解决的典型问题包括:几十台机器装了同一个服务,版本漂移、配置不一致、没法统一看资源占用等情况。

为什么选 Rocky Linux?因为 CentOS 8 停止维护之后,很多生产环境的运维朋友都在找替代品,Rocky Linux 是国际上认可度较高的 CentOS 兼容发行版之一。它的软件包管理方式、服务管理方式、目录结构都和传统 RHEL 系基本一致,迁移成本很低。如果你以前写过 CentOS 的 systemd 服务和 firewalld 规则,切到 Rocky 几乎不需要重新学习。这篇教程就以 Rocky Linux 为基础环境,默认读者使用的是 x86_64 架构,如果用的是 ARM 架构的机器,个别软件包版本需要你自己留意一下。

顺带提一句,搜索热词里有个“bcoreos实战:用一个升级包,让 rocky linux 跑进 ubuntu 服务器”的说法。这个其实是另一种思路:通过打包容器或者整个系统的可执行镜像,把 Rocky 环境搬到其他发行版宿主上运行,和本篇直接从官方源安装不是一条路线,感兴趣的朋友可以把它理解为“便携化系统”方案。但如果你想在正式环境稳定使用,我建议还是老老实实按本文的步骤来。

在文章正式开始之前,先给一个结论性的定心丸:整个安装过程如果用官方仓库来装,Hermes Agent 的安装包很小,通常几十 MB 级别,不会对系统造成什么负担;Hermes-Web-UI 则是一个基于 Web 的服务端程序,需要 Node.js 环境或配套运行时,资源占用也不高。所以你在 2 核 4G 的入门级云主机上跑这两个组件是完全够用的。

2. 环境准备里最容易翻车的三个细节:静态 IP、镜像源、防火墙和 SELinux

Rocky Linux 装 Hermes Agent,最大的问题往往不是 Agent 本身,而是系统初始环境没有收拾干净。很多人在装完系统后什么都不调,直接就开始装软件,然后遇到网络不通、源下载超时、服务起不来等问题,回头才发现是基础配置出了问题。

2.1 先给机器一个固定网络身份

如果你是在虚拟机或者物理机上安装,强烈建议先把 IP 配置成静态的。搜索热词里有“rocky linux设置静态ip”,说明这确实是很多人卡住的第一步。Agent 安装后需要持续上报数据给 Web-UI 服务端,如果 Agent 所在机器的 IP 是 DHCP 动态分配的,一旦 IP 变了,Web-UI 上记录的主机身份就会失效,控制台里会出现主机离线或者重复注册的情况。

Rocky Linux 使用的是 NetworkManager 管理网络,配置静态 IP 最直接的方式是修改/etc/NetworkManager/system-connections/下的连接配置文件,或者用nmcli命令。给一个最常用的nmcli示例:

# 查看当前网络连接名称,一般是 ens33、eth0 之类 nmcli con show # 假设连接名是 ens33,配置静态 IP nmcli con mod ens33 ipv4.method manual \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns "223.5.5.5 8.8.8.8" # 重启连接使配置生效 nmcli con down ens33 && nmcli con up ens33 # 验证 ip addr show ens33

这里建议 DNS 使用国内公共 DNS 加国际公共 DNS 的组合,避免单一 DNS 故障导致域名解析失败。

2.2 Rocky Linux 9 的 dnf 源问题:官方源慢和网络源失效

Rocky Linux 9.6 是个比较新的版本,系统安装完默认使用的是 Rocky 官方镜像源。在国内服务器上,官方源经常会出现连接慢、传输超时的情况。搜索热词里也出现了“rocky linux 8.10 yum源”和“rocky linux 9.6系统安装教程”,说明很多人都在各版本之间跳转,但都没弄明白源的问题。

处理思路很简单:把 dnf 源替换为国内镜像源。以 Rocky Linux 9 为例,先备份系统默认源配置:

mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

然后创建新的源文件,例如/etc/yum.repos.d/Rocky.repo,内容可以参考国内镜像站提供的配置模板。注意 Rocky Linux 的源分为BaseOSAppStreamextras等仓库,全部要配置好,否则后续安装依赖时会出现个别软件包找不到的情况。配置完成后执行:

dnf clean all dnf makecache

提示:修改源文件时,务必把gpgcheck=1保留,并正确填写 GPG Key 的地址,否则安装软件时会因为校验失败被拦截。

2.3 防火墙和 SELinux 对端口访问的影响

Rocky Linux 默认开启了 firewalld 服务和 SELinux。安装 Hermes-Web-UI 后,服务会监听某个 TCP 端口(比如 8080 或 3000)。如果你的 Web-UI 和 Agent 不在同一台机器上,Agent 要访问 Web-UI 的地址,或者你要从本地浏览器访问 Web-UI,都必须先把端口放行。不然后果是:服务明明在跑,日志也正常,但外部就是连不上。

放行端口的命令:

# 假设 Web-UI 使用的端口是 8080 firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload firewall-cmd --list-ports

SELinux 的问题比较隐蔽。如果确认防火墙已经放行但仍然连不上,可以查看 SELinux 的审计日志:

grep "denied" /var/log/audit/audit.log | tail -n 20

如果看到类似avc: denied { name_connect }的记录,说明 SELinux 阻止了服务的网络访问。临时放行可以用:

setsebool -P httpd_can_network_connect 1

或者更直接地,将整个服务上下文设为 permissive(不推荐在生产长期使用):

setenforce 0

一个更规范的做法是为服务编写自定义 SELinux 策略模块,这个在正式生产环境中更稳妥,但如果你只是测试环境,先setenforce 0跑通流程再说也没问题。

3. Hermes Agent 安装流程详解:半自动化的“登录”是什么回事

搜索热词里“hermes agent安装”“hermes agent安装要登录网站怎么回事”出现得比较频繁,这里单独开一节说明。

了解清楚安装逻辑,你就不慌了。Hermes Agent 的安装模式通常会分两步走:

  1. Agent 安装包落到机器上,解压并安装为一个系统服务;
  2. Agent 启动时需要一个“接入凭据”(类似于设备接入码/Agent Token),它需要和 Hermes-Web-UI 完成对接才能正常上报数据。

很多人安装时遇到“要登录网站”的提示,其实就是第二步的引导。某些版本的 Hermes Agent 在安装时会弹出一个登录验证页面,要求你在浏览器里登录 Hermes-Web-UI 的后台账号,然后自动生成这个设备本地的接入凭据。这属于“半自动安装模式”。

3.1 用离线 Token 方式避免交互登录

生产环境中大多数服务器没有图形界面,也没有浏览器,根本不可能“登录网站”。正确的做法是在 Hermes-Web-UI 的界面上提前创建一个“接入令牌”或者“设备分组密钥”,然后在 Agent 安装时通过参数将它传进去,跳过登录环节。

以命令行安装为例,大致的安装流程是这样的:

# 1. 下载 Agent 安装包 wget https://download.your-hermes-server.com/agent/hermes-agent-latest.x86_64.rpm # 2. 安装 RPM 包 dnf install -y ./hermes-agent-latest.x86_64.rpm # 3. 配置接入凭据 # 注意 token 是你在 Web-UI 后台生成的,下面命令是示意 hermes-agent config --server=https://your-web-ui.example.com --token=YOUR_AGENT_TOKEN # 4. 启动服务 systemctl enable --now hermes-agent

不同的 Hermes Agent 版本,命令行参数名可能略有差异,有的用--apikey,有的用--token,有的用环境变量HERMES_AGENT_TOKEN。安装前先用hermes-agent --help查看一下当前版本支持的参数。

3.2 桌面版安装报错的处理思路

搜索热词里有“hermes agent桌面版安装报错”,这多半是 Windows 桌面版或者带 GUI 的 Linux 桌面版安装时出现的问题。常见原因包括:

  • 缺少 VC++ 运行库(Windows 下最常见);
  • 安装路径含中文或空格
  • 本地端口被占用
  • 杀毒软件误拦截

如果桌面版安装报错,可以先看日志文件。Hermes Agent 的日志通常在安装目录的logs文件夹下,或者在 Linux 的/var/log/hermes/下。报错信息里如果包含EACCES或者address already in use,那就是端口被占或者权限不足,手动换个端口或者用管理员权限安装即可。

实际经验:Windows 桌面版报错还有一个高发原因是“杀毒软件隔离了 Agent 的启动进程”。安装时先用管理员身份关闭实时防护,装完再恢复,基本就能解决。

3.3 Agent 装完怎么验证它真的在干活

安装完成后,不能只看服务是 active 状态就觉得万事大吉。建议做以下几步验证:

# 1. 查看服务状态 systemctl status hermes-agent # 2. 检查进程是否存在 ps aux | grep hermes-agent # 3. 检查 Agent 日志,看是否成功连上服务端 tail -f /var/log/hermes/agent.log

在日志中如果看到类似connection establishedregistration successfulheartbeat sent之类的关键词,说明 Agent 已经正常上报。接下来到 Hermes-Web-UI 的设备列表页,你应该能看到这台新主机上线。如果显示离线,多半是服务器地址填错了,或者服务端端口没有放行。

4. Hermes-Web-UI 的部署方式与配置重点

Web-UI 的安装和 Agent 不同,它属于“服务端”,可以有多种部署方式。这里介绍两种最常见的方式,一种是直接使用官方提供的安装脚本(适用于快速体验),另一种是使用 Docker 部署。

4.1 官方安装脚本的坑和解决

如果你的 Web-UI 也装在同一台 Rocky Linux 上,官方文档一般会提供一键安装脚本,比如:

curl -sSL https://get.your-hermes-server.com/ui/install.sh | bash

这个脚本方便是方便,但你执行之前最好先大致浏览一下脚本内容,看看它默认安装到什么目录、用什么用户启动服务、会把哪些端口暴露出来。脚本安装完后,Web-UI 一般会作为一个 systemd 服务跑起来,服务名可能是hermes-webuihermes-ui

脚本安装方式最容易出的问题是默认绑定的监听地址。有些版本默认监听127.0.0.1:8080,只能在本地访问。要改成允许局域网访问,需要修改配置文件里的host字段为0.0.0.0,然后重启服务。

4.2 Docker 部署方式:更干净的隔离环境

如果你不想让 Web-UI 的运行时依赖污染主机的系统环境,Docker 是更好的选择。但前提是你的 Rocky Linux 上已经安装好了 Docker CE。Docker 安装可以参考官方仓库,这里不展开。下面是 Hermes-Web-UI 的 docker-compose 示例:

version: "3.8" services: hermes-webui: image: your-registry/hermes-web-ui:latest container_name: hermes-webui restart: always ports: - "8080:8080" volumes: - hermes-data:/app/data - hermes-logs:/app/logs environment: - TZ=Asia/Shanghai - HERMES_DB_PATH=/app/data/hermes.db volumes: hermes-data: hermes-logs:

启动:

docker compose up -d

Docker 方式的优势在于升级方便,拉个新镜像重启容器就行;数据目录独立在 volume 里,重装容器不会丢数据。

4.3 会话老是丢失的排查链路

热搜词里有一条“我的hermes-web-ui的会话老是丢失”,这个问题在实际使用中确实很影响体验,典型表现是:登录后台没过多久,刷新页面就要求重新认证,或者 Agent 上报一段时间后就断开连接,Web-UI 里看不到实时数据了。

这个问题的根源通常不在 Web-UI 本身,而在于会话保持机制和网络链路。排查思路如下:

  1. 先区分是“人登录后台的会话”还是“Agent 与 Web-UI 的长连接会话”。如果你是指浏览器后台登录状态老是掉,通常和 Web-UI 的会话过期时间、Cookie 配置、反向代理的缓存策略有关。如果你是指 Agent 上报数据断断续续、主机在控制台反复离线,那属于长连接稳定性问题。

  2. 检查 Web-UI 与 Agent 之间的网络稳定性。pingtelnet测试端口连通性:

    ping 目标Web-UI服务器IP telnet 目标Web-UI服务器IP 8080

    如果有丢包或者延迟剧烈波动,Agent 的长连接自然保不住。

  3. 检查 Web-UI 的会话超时配置。不同版本的 Hermes-Web-UI 配置项名称不同,常见的有session-timeoutsession.maxAgetoken-expire。把它从默认的 30 分钟调成 24 小时,能显著减少“会话丢失”的体感。如果你用了 Nginx 反向代理,还要检查 Nginx 的proxy_read_timeoutproxy_send_timeout,这两个值默认 60 秒,如果后端有 WebSocket 长连接,必须调大到 3600 以上,否则连接会被 Nginx 掐断,Agent 隔一阵子就会掉线重连,表现为会话反复丢失。

    Nginx 关键配置示例:

    location / { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; proxy_send_timeout 3600s; }
  4. 如果 Web-UI 用的是 SQLite 数据库,还要考虑并发锁的问题。当 Agent 数量较多、上报频率较高时,SQLite 可能会出现database is locked错误,导致 Web-UI 写入失败,进而让会话数据无法持久化,表现也是“会话丢失”。这种情况可以考虑切换为 PostgreSQL/MySQL 后端,或者降低 Agent 的上报频率。

排查链路总结成表格就是:

现象可能原因排查命令/位置解决方案
浏览器后台频繁掉登录会话超时时间过短Web-UI 配置文件中的 session 字段调大 session-timeout
控制台主机反复离线长连接被 Nginx 掐断Nginx error.log调大 proxy_read_timeout
服务端日志频繁报错SQLite 锁冲突Web-UI 日志换 PostgreSQL/降低上报频率
网页间歇性无法打开本地端口被占用或服务内存不足ss -lntp/free -h换端口/扩容或清理内存

当时我排查自己的 Web-UI 会话丢失问题时,卡得最久的就是 Nginx 反代的 WebSocket 升级头没有配置,导致 Agent 的连接断断续续。这个问题很隐蔽,因为用curl测试 HTTP 访问是完全正常的,只有长连接会断。如果你也是用 Nginx 反代部署 Web-UI,务必检查上面那段配置里的Connection "upgrade",这是最容易被漏掉的地方。

5. 配置好 Agent 规则与告警后,必须做的功能验证

Web-UI 部署完成、Agent 接入成功之后,安装工作还差最后一步:验证核心功能有效。很多人装完就以为结束了,结果过了一个月打开控制台发现一条告警都没有,后来才知道采集规则根本没有下发成功。

5.1 配置采集规则

在 Hermes-Web-UI 的后台界面,一般会有一个“采集配置”或“规则管理”的入口。在这里可以新增规则,例如采集 CPU 使用率、内存使用率、磁盘空间、指定端口存活状态、自定义日志关键字等。

规则的执行频率建议先从 60 秒开始,不要贪图实时性设置成 1 秒,否则 Agent 数量上来之后 Web-UI 的写入压力会指数级增长。每个 Agent 每 60 秒上报一次,10 台 Agent 就是每秒约 0.17 次写入,100 台就是 1.7 次,这个量级 SQLite 还能扛住;但如果每 5 秒上报一次,100 台 Agent 就是每秒 20 次写入,SQLite 很容易成为瓶颈。所以规则粒度要合理,既能满足监控需求,又不至于拖垮服务端。

5.2 验证告警通路

配置完采集规则后,手动构造一个异常事件来验证告警链路是值得做的步骤。例如:

# 故意停掉一个被监控的服务 systemctl stop sshd # 或者向被监控的日志文件写入一条 ERROR 级内容 echo "ERROR this is a test alert" >> /var/log/app/test.log

然后到 Web-UI 查看是否触发了告警、是否收到了邮件/钉钉/Webhook 通知。如果没有收到通知,优先检查 Web-UI 的告警通道配置——SMTP 服务器、Webhook 地址、告警接收人列表是否填写完整。

5.3 规则热更新:是否要重启 Agent

一个比较实际的问题是:每次调整采集规则,是不是都要重启 Agent?答案取决于 Hermes Agent 的实现机制。部分版本的 Agent 支持“配置热加载”,只要服务端下发新规则,Agent 会在下一个心跳周期自动拉取并生效,不需要重启。但有些早期的版本需要重启 Agent 才能刷新规则。

我的建议是:如果 Agent 支持热更新,就在 Web-UI 上修改配置后等待一个心跳周期(一般是 1~2 分钟)观察日志变化;如果不确定当前版本是否支持,直接重启一次 Agent 也不会有任何损失:

systemctl restart hermes-agent

总比配置半天发现没生效强。

6. 长期运行的稳定性调优与常见故障速查

现在系统已经跑起来了,Agent 在线、Web-UI 可见、告警能收到。但在后续的长期运行中,你还会碰到一些频率不低的问题。这里把我和身边朋友实际遇到过的典型情况整理成一个速查表,并按运维优先级排序。

6.1 资源占用异常排查

有一次我发现自己的一台 Rocky Linux 服务器 CPU 占用一直居高不下,top 一看hermes-agent进程占了 120% 的 CPU。查日志发现是 Agent 在反复尝试连接一个已经失效的 Web-UI 地址,每次连接超时都要等 30 秒,然后退避重试,导致 CPU 空转。解决办法很简单:重新运行hermes-agent config --server=正确的Web-UI地址,然后重启服务。

如果你也碰到 Agent 进程 CPU 资源占用过高的问题,检查顺序是:

  1. 查看 Agent 连接的服务端地址是否还能正常访问;
  2. 检查采集规则是否过于密集,例如同时配置了多个 1 秒级高频采集;
  3. 查看日志中是否有大量网络重试记录。

如果是规则过密,调大采集时间间隔即可;如果是连接不可达,修好网络地址后重启服务,CPU 会立刻降下来。

6.2 Web-UI 日志文件撑爆磁盘

Web-UI 长时间运行后,日志目录下的文件会持续增长。/app/logs/var/log/hermes-webui/下经常躺着好几个 GB 的日志文件。这是因为默认的日志轮转策略没有生效。

建议配置 logrotate,以 Rocky 自带的 logrotate 为例,创建文件/etc/logrotate.d/hermes-webui

/var/log/hermes-webui/*.log { daily rotate 14 compress delaycompress missingok notifempty copytruncate }

然后运行:

logrotate -f /etc/logrotate.d/hermes-webui

这样日志保留 14 天,按天滚动压缩,基本不会出现日志撑爆分区的问题。Agent 端的日志同理,如果长期不清理,某些版本的 Agent 也可能把/var/log/hermes目录写满,特别是开启了 debug 模式之后,日志增长速度非常快。

6.3 Agent 状态显示离线但进程还活着

这类问题最迷惑人:systemctl status hermes-agent显示 active,进程也在,但 Web-UI 上就是显示离线。我用一个排查流程来解决这类困扰:

  1. 先看 Agent 日志,搜索heartbeat或者last heartbeat关键字,确认 Agent 的自身心跳是否正常;

  2. tcpdumpss -tnp查看 Agent 是否有到 Web-UI 端口的实际 TCP 连接。例如:

    ss -tnp | grep 8080
  3. 确认是 Agent 根本没在发请求(如服务端地址配错),还是发了请求但服务端没收到(如网络中间被防火墙丢包);

  4. 如果两者都不是,试用curl手动请求 Web-UI 的健康检查接口,确认 Web-UI 的 API 是否还能正常响应:

    curl http://127.0.0.1:8080/healthz

很多所谓的“离线”本质是 Web-UI 的 API 服务假死(进程在但线程池满了不响应),这时候重启 Web-UI 服务而不是重启 Agent 就能恢复整个链路。

6.4 升级版本时的注意事项

Hermes Agent 和 Web-UI 的升级策略不太一样。Agent 端升级通常直接下载新版本 RPM 包覆盖安装,然后重启服务即可:

dnf install -y ./hermes-agent-new-version.x86_64.rpm systemctl restart hermes-agent

Web-UI 端如果是 Docker 部署,升级也只是拉新镜像、重建容器,但要留意数据库的兼容性。升级前先备份数据卷或数据库文件,特别是跨大版本升级时,有些版本的 Web-UI 会更新数据库 schema,老数据可能有兼容风险。

经验之谈:升级 Agent 之前最好不要同时升级 Web-UI。先升级 Web-UI 并确认数据库迁移成功,再逐个升级 Agent,这样即使升级后出现不兼容,也能快速判断是哪一侧出了问题。

7. 几个值得养成的好习惯:备份、别名和例行检查

如果上面的安装与验证都做完了,这篇文章的核心内容其实已经结束。但根据我实际运维小半年的经验,最后再补充几个可能不会出现在官方文档里的习惯,能让你在后续使用中少很多麻烦。

第一个习惯是定期备份 Web-UI 的数据库。如果你用的是 Docker volume 里的 SQLite 文件,一条命令就能完成快照式备份:

docker exec hermes-webui cp /app/data/hermes.db /app/data/hermes.db.bak docker cp hermes-webui:/app/data/hermes.db.bak /backup/hermes-$(date +%F).db

用 Cron 定时每天执行一次,出现误删主机或规则被改坏的场景时,恢复数据的成本会低很多。

第二个习惯是给常用的排查命令设置别名,无脑减少敲键盘的时间,比如:

alias hlog='tail -f /var/log/hermes/agent.log' alias huilog='tail -f /var/log/hermes-webui/webui.log' alias hstatus='systemctl status hermes-agent hermes-webui'

写到~/.bashrc里,重启 shell 后直接hstatus就能一次性看到两个服务的运行状态。

第三个习惯是每周快速巡检一次。我的做法是写一个 10 行 shell 脚本,依次检查服务状态、磁盘占用、Agent 最近心跳时间、Web-UI API 健康检查,然后输出一个简短报表。不需要复杂的监控平台,对于小规模集群来说,人肉巡检配合邮件告警已经足够了。

这套 Rocky Linux 安装 Hermes Agent 与 Hermes-Web-UI 的组合,稳定运行后基本不需要频繁人工干预,维护成本相当低。真正费神的时刻都集中在首次部署后的前两周,把规则配好、把网络调顺、把会话保持搞定,后面的使用体验非常顺畅。如果你照着本文搭建时在其他细节上卡住,优先看日志,其次看网络链路,大部分问题都能以“日志里有没有 specific 报错”为切入点定位出来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 20:33:44

硬件工程师入门三件套:Buck、Buckboost与BLDC驱动实战解析

硬件入门先练什么?我第一次见这句话是在评论区,原话大概是:能自己画板、调通一块 buck 降压,再做一块双向 buckboost,最后能转起一台无刷电机,整个电源和驱动的底子基本就稳了。后来面试硬件岗也遇到过类似…

作者头像 李华
网站建设 2026/9/5 20:24:24

基于Flask与Neo4j构建三国人物知识图谱:从数据抽取到可视化问答

简介:这是一套面向Python初学者与知识图谱入门者的实战项目资源,基于Flask框架构建三国演义人物关系可视化及智能问答系统,解决古典文学数据结构化分析与交互式探索的实际问题。资源包共364个文件,含12个核心Python脚本&#xff0…

作者头像 李华
网站建设 2026/9/5 20:22:29

打喷嚏时为什么要用手肘挡?从飞沫到气溶胶的喷嚏礼仪

你有没有注意过,当办公室里有一个人突然打喷嚏,大多数人在那一瞬间的动作是什么?手会比脑子更快地伸向口鼻,用手掌心捂个严实。这个动作看起来很有礼貌,却可能是喷嚏礼仪里最不理想的一种。经历过呼吸道传染病高发季节…

作者头像 李华