Linux:进程、systemd、网络与存储
先明确服务账户、固定状态目录、flock 与 timer,再对照配套示例理解任务退出码、journal 和四个日志文件。
前置是身份与路径。适用范围、日期和未执行约束同环境边界;这一篇建立解释现象的模型,不启动服务、网络探测或磁盘工具。
进程、信号与资源
Linux 进程具有 PID、父子关系、凭据、打开的文件描述符和资源使用状态。线程是可调度的执行实体,同一进程内通常共享地址空间与文件表。ps 是时点快照;PID 可以复用,记录 PID 时应同时记录启动时间、命令路径和服务归属,避免误停后来占用同一号码的进程。
SIGTERM 给程序正常退出的机会,SIGKILL 不能由用户程序捕获,不能保证执行清理。处于不可中断等待的任务可能要等内核操作返回才处理致命信号。父进程退出不保证所有子进程退出,孤儿可被重新托管;僵尸已经退出,等待父进程收集状态,通常不是“再 kill 一次”解决。Shell 后台符号和 nohup 只影响启动/信号关系,不提供完整的崩溃恢复、权限隔离和日志保留。
CPU 百分比是时间使用比例,load average 包括可运行任务与某些不可中断等待任务的平均数量,不是 CPU 使用百分比。内存中的 cache 可回收程度和工作集相关,free 中 available 比简单观察 free 一列更能提示余量;也要考虑 cgroup 限额,主机有余量不等于服务没有 OOM 风险。
systemd服务生命周期
Linux systemd 服务由单元描述启动身份、命令、依赖和超时。Type=oneshot 适合执行完就结束的任务;ExecStart 直接启动程序,不自动经过 Shell,因此管道、重定向和变量展开不能照搬交互终端。需要 Bash 的完整逻辑放进明确的脚本,由绝对路径调用。
start 请求当前启动,enable 建立随目标启动的关系;enabled 不等于 active,disabled 也不等于当前没有运行。成功的 oneshot 没有 RemainAfterExit 时通常变成 inactive (dead),应结合 Result、ExecMainStatus 和日志判断,不能要求它长期 active。Restart 策略、依赖启动顺序与应用就绪也是不同概念,After 只排序,不保证下游可接受请求。
系统单元的本地覆盖通常放 /etc/systemd/system,发行版文件不直接改写;修改单元后 reload 服务配置与 daemon-reload 管理器定义含义不同。drop-in 合并结果需要核对,不能只看一个文件。维护样本只有 timer 被 enable,service 由 timer 激活。
定时与互斥
Linux systemd timer 的 OnCalendar 按日历时间调度;Persistent=true 在重新激活时可补一次错过的触发,不是将关机期间每一轮逐条重放。AccuracySec 允许计时合并窗口,RandomizedDelaySec 增加随机延迟,不能承诺精确到秒。样本明确 UTC,每日 03:00 后受这些窗口影响;它不是严格间隔 24 小时。
同一 service 已在运行时,timer 到点不会为它再创建一个并行实例,但手动执行脚本仍可能重叠。flock 是建议锁,只约束使用同一锁的参与者;维护任务先取得固定 .lock 文件的排他锁,再读取和轮转,锁忙返回 75。本例不能删除再创建锁文件,否则旧进程与新进程可能锁住不同 inode。cron 也能调度任务,但其环境、输出、服务名和漏跑策略与 timer 不同,不能混用两种调度器重复安排同一任务。
网络:地址、路由与监听
Linux 网络排错应区分接口地址、路由选择、DNS 解析、TCP 监听、TLS 与应用响应。ip address 说明接口配置,ip route 说明出站路径,ss -lntp 观察监听套接字;进程详情可能受权限限制。这些观察不证明远端访问策略与回程路径正确。
监听在 127.0.0.1 只接受本机回环目标,0.0.0.0 表示所有本机 IPv4 地址;IPv6 的 :: 是否同时接收 IPv4 取决于套接字与系统配置。端口号不是 PID,HTTP 成功不能由 ping 成功代替;ICMP 被过滤也不能证明 TCP 必坏。容器的网络命名空间可能与主机不同,应先说明当前观察哪个空间。
发行版持久网络配置可能由 NetworkManager、systemd-networkd 或其他工具管理,直接修改旧 ifcfg 文件不保证生效。远程变更地址前需要可用的带外恢复路径,不能把历史私网地址抄到当前主机。本课程只解释判断链,不做网卡变更。
存储:挂载、容量与打开文件
Linux 磁盘空间要区分块设备、分区、文件系统与挂载点。df 查看挂载文件系统的统计,du 遍历可见文件计算占用;两者口径不一样。inode 耗尽也会阻止创建文件,剩余字节不能排除 No space left on device;配额与只读挂载可能在有空闲空间时阻止写入。
删除路径只是解除目录项。已打开但被删除的文件仍可占用空间,最后一个相关引用释放后才具备回收条件;rename 也不会让已有文件描述符自动切换到新文件。这解释了为何轮转外部程序日志通常需要约定重新打开机制。copytruncate 在复制和截断之间可能丢失写入,不能称为无损方案。维护样本只轮转自己独占写入、当时尚未打开的日志,从任务模型上避开外部写者竞争。
挂载会遮住原目录中的文件,跨挂载点的 mv 可能退化成复制再删除,不能概括为一次原子 rename。备份需要独立副本与恢复证明;三份本机轮转不是备份。对正在写入的数据库直接 tar 目录也不能推出一致性快照。
练习与参考解答
题目:服务 inactive、timer active,日志最后显示退出 0,是否故障?df 已用高而 du 小,是否可以直接删业务目录?
参考解答:成功 oneshot 结束后 inactive 是正常候选,应核对最近触发时间和结果;第二种要先查挂载边界、权限可见性、打开的已删除文件、预留空间及配额,删除更多目录可能既不解决根因又丢数据。现象不足时记录假设和下一项观察,不把相关性当结论。
一手资料
核对 2026-10-17:systemd v255 timer 源文档用于日历和补跑语义;Linux 6.8 proc 文档用于进程状态背景;open 手册用于文件描述符模型;logrotate 上游手册用于轮转与复制截断边界。这里固定文档族和概念,不把上游 main 当作目标主机安装版本。
文件类型、存储层次与 Swap 阅读边界
磁盘容量检查为何不能执行 mkfs,Swap 配方能否通用? 文件类型标记要区分普通文件 -、目录 d、块设备 b、字符设备 c、符号链接 l、套接字 s 与命名管道 p。旧文把块设备和字符设备都写作 d/c、把权限串写缺位的示例撤回;改变所有权和改变访问模式也不是同一操作。不要把递归 chmod 当成修好完整路径的默认办法,目录搜索和文件读取需要分别判断。
块设备、分区、文件系统、挂载点和文件是不同对象;df 统计挂载文件系统,du 统计可见文件。mount 会改变路径可见内容;mkfs、fdisk 写分区与文件系统,不能混进只读容量检查。旧 mount/fdisk 的帮助输出只对应来源版本,RAID 和监控脚本是未完成标题与空函数,不构成已交付方案。
Swap 是内存管理的一部分,不能取代物理内存容量规划。swapon/free 的观测与创建、初始化、启用、停用交换文件是不同层次;是否适合交换文件还受目标文件系统与内核约束。历史 fallocate/dd/mkswap/fstab 整段配方不作为通用部署步骤:重复执行可能覆盖已有文件,持久配置错误会影响启动,停用也需要足够的承接内存。旧文把 swappiness 称作交换优先级并给出固定范围/推荐值的表述撤回,本课不提供内核调优参数或保证 Swap 防止崩溃。
旧运行级别、信号与 SSH 端口变更
父进程退出子进程必退出吗,killall 接受 PID 吗? SysV 运行级别是历史启动组织方式,chkconfig 列出的 SysV 服务不等于全部 systemd 单元。旧 init 0/6、修改 network 的运行级别和 /etc/init.d/network stop 会改变主机运行或管理连接,不能作为认识系统的练习顺序;空 inittab 解析和进程监控脚本不构成完整实现。systemd 的当前状态、启用关系与依赖按本篇分别判断。
父进程退出不保证子进程一同退出,kill 默认发送信号也不保证立即终止;killall 按名称而非 PID 选择对象,可能波及同名程序。旧 kill -9 与 killall -u 批量操作不作为第一步。应记录进程路径、身份、启动时间和服务归属,先按管理器正常停止,必要时再分析信号。ps/top/lsof 是不同时间与范围的观察,lsof 返回监听者仍需核对命名空间,不能仅凭端口号终止进程。
SSH 改端口涉及 sshd 配置、监听、SELinux 端口标签、主机/云访问策略和实际客户端连接。历史保留原端口并从另一主机登录的经验可吸收为保留恢复通道,但改端口不替代密钥验证与用户授权。旧主机端口号、root 登录输出和 semanage 命令不是所有发行版通用配置。
继续阅读
- 命令与系统观察
- 命令与系统观察
- 应用实践