标签

Linux

Linux 是一个广泛使用的开源操作系统内核,由林纳斯·托瓦兹(Linus Torvalds)于1991年创建。它是 Unix-like 操作系统的一个重要分支,并且它的设计和实现遵循了模块化的设计原则。Linux 内核本身可以与不同的用户空间组件配合,形成完整的操作系统。这些完整的系统被称为 Linux 发行版,例如 Ubuntu、Fedora、Debian、CentOS 和 Arch Linux 等。

Linux
服务端6月21日 21:42
APT、DNF/YUM 和 Pacman 常见操作有哪些?Linux 下装软件,最怕的不是命令记不住,而是把不同发行版的包管理器混着用:Ubuntu 上找 `yum`,Arch 上只跑 `pacman -Sy`,RHEL 新版本里还在把 `yum` 当主角。结果轻则装不上包,重则依赖版本被搞乱。 这篇按日常运维最常见的场景整理 APT、DNF/YUM、Pacman 的用法:安装、升级、删除、查询、仓库管理、PPA/EPEL/AUR,以及遇到锁、依赖损坏、数据库异常时怎么处理。 ## 先分清它们分别用在哪些系统 | 包管理工具 | 常见发行版 | 底层包格式 | 说明 | |---|---|---|---| | APT | Debian、Ubuntu、Linux Mint | `.deb` | 日常用 `apt`,脚本里更推荐 `apt-get` / `apt-cache` | | DNF | Fedora、RHEL 8+、CentOS Stream、Rocky/AlmaLinux 8+ | `.rpm` | 现代 RHEL 系默认包管理器,基本取代 YUM | | YUM | CentOS 7、RHEL 7 及更早版本 | `.rpm` | 老系统常用;新系统里 `yum` 多数只是兼容入口 | | Pacman | Arch Linux、Manjaro、EndeavourOS | `.pkg.tar.zst` | 速度快、模型简单,但不要做部分升级 | APT、DNF/YUM、Pacman 负责解决依赖、从仓库下载软件、记录安装状态。`dpkg` 和 `rpm` 更接近底层包工具,能安装本地包,但不会像上层包管理器那样自动处理远程依赖。 ## APT 常见操作 APT 主要用于 Debian/Ubuntu 系统。交互式操作可以用 `apt`,自动化脚本更建议用 `apt-get` 和 `apt-cache`。 ```bash sudo apt update sudo apt upgrade sudo apt full-upgrade sudo apt install nginx sudo apt remove nginx sudo apt purge nginx sudo apt autoremove apt search nginx apt show nginx apt list --installed apt-cache policy nginx ``` `apt update` 只是刷新本地软件包列表,不会升级已安装软件。`remove` 删除软件但通常保留配置文件,`purge` 连配置文件一起删除,`autoremove` 清理不再被依赖的包。 `dpkg` 用来直接处理 `.deb` 包。它不会主动从网络仓库解决依赖,所以本地安装 deb 包后如果报依赖缺失,通常要再用 APT 修复。 ```bash sudo dpkg -i package.deb sudo apt -f install dpkg -L nginx dpkg -S /usr/sbin/nginx sudo dpkg --configure -a ``` Ubuntu/Debian 的仓库配置常见位置包括 `/etc/apt/sources.list` 和 `/etc/apt/sources.list.d/*.list`。现在不推荐随手使用老式 `apt-key add`,更稳妥的方式是把仓库密钥放到 `/usr/share/keyrings/`,再在源配置中使用 `signed-by=` 指定密钥文件。 ## DNF 和 YUM 常见操作 RHEL 系现在要优先看 DNF。Fedora、RHEL 8+、Rocky Linux 8+、AlmaLinux 8+ 默认使用 DNF;CentOS 7、RHEL 7 这类老系统仍然以 YUM 为主。 ```bash sudo dnf install nginx sudo dnf upgrade sudo dnf check-update sudo dnf remove nginx sudo dnf autoremove sudo dnf search nginx sudo dnf info nginx sudo dnf list installed sudo dnf clean all sudo dnf provides /usr/sbin/nginx ``` 老系统中对应命令是 `yum install`、`yum update`、`yum remove`、`yum search`。 DNF/YUM 的 history 很适合排查“昨天装了什么之后服务坏了”。 ```bash sudo dnf history sudo dnf history info 12 sudo dnf history undo 12 ``` `rpm` 是 RHEL 系的底层包工具,类似 Debian 系里的 `dpkg`。 ```bash sudo rpm -ivh package.rpm sudo rpm -Uvh package.rpm sudo rpm -e package-name rpm -qa | grep nginx rpm -qi nginx rpm -ql nginx rpm -qf /usr/sbin/nginx rpm -Va ``` EPEL 很方便,但生产环境不要无脑启用一堆第三方仓库。仓库越多,版本冲突和依赖覆盖的概率越高。 ## Pacman 常见操作 Pacman 是 Arch 系发行版的核心包管理工具。它的命令短,但有一个重要原则:**不要做部分升级**。 ```bash sudo pacman -Syu sudo pacman -S nginx sudo pacman -R nginx sudo pacman -Rs nginx pacman -Q pacman -Ss nginx pacman -Si nginx pacman -Ql nginx ``` `pacman -Syu` 是 Arch 上最常用、也最安全的更新方式:同步软件包数据库并升级整个系统。不要长期只执行 `sudo pacman -Sy package-name`,这容易造成“本地系统还是旧依赖,但数据库指向新依赖”的部分升级问题。 Pacman 会保留下载过的软件包缓存,方便回滚,但时间久了会占不少空间。 ```bash sudo pacman -Sc sudo pacman -S pacman-contrib sudo paccache -r sudo paccache -rk2 ``` AUR 是 Arch 用户仓库,里面是用户维护的构建脚本,不是官方二进制仓库。常见 AUR helper 有 `yay`、`paru`。安装前至少看一下 `PKGBUILD`,生产服务器不太建议依赖 AUR。 ## 常见排查:锁文件、依赖损坏和数据库异常 APT 锁被占用时,先看是不是系统正在自动更新,别上来就删锁文件。 ```bash ps aux | grep -E 'apt|dpkg' sudo dpkg --configure -a sudo apt -f install ``` DNF/YUM 也先检查是否有其他包管理进程: ```bash ps aux | grep -E 'dnf|yum|rpm' sudo dnf clean all sudo dnf makecache ``` Pacman 锁文件通常在 `/var/lib/pacman/db.lck`,也要先确认没有正在运行的 pacman,再删除锁。Arch 上很多问题来自部分升级,先尝试完整升级: ```bash sudo pacman -Syu ``` ## 日常使用建议 先确认发行版,再选包管理器。Ubuntu/Debian 用 APT,RHEL 新系统用 DNF,CentOS 7 这类老系统用 YUM,Arch 用 Pacman。脚本里优先用稳定命令,Debian/Ubuntu 脚本建议 `apt-get`、`apt-cache`;人工操作用 `apt` 更舒服。 不要混用来源。同一个软件尽量别同时用系统仓库、第三方仓库、手动 deb/rpm、源码安装,否则后续升级和卸载都难排查。第三方仓库要克制,PPA、EPEL、AUR 都好用,但不是越多越好。看到锁先等,不要先删。Arch 不做部分升级。底层工具少直接用,能用 APT/DNF/YUM 解决依赖时,别手动硬装。 ## 快速命令对照 | 场景 | APT | DNF | YUM | Pacman | |---|---|---|---|---| | 更新索引 | `sudo apt update` | `sudo dnf makecache` | `sudo yum makecache` | `sudo pacman -Sy` | | 升级系统 | `sudo apt upgrade` | `sudo dnf upgrade` | `sudo yum update` | `sudo pacman -Syu` | | 安装软件 | `sudo apt install nginx` | `sudo dnf install nginx` | `sudo yum install nginx` | `sudo pacman -S nginx` | | 删除软件 | `sudo apt remove nginx` | `sudo dnf remove nginx` | `sudo yum remove nginx` | `sudo pacman -R nginx` | | 搜索软件 | `apt search nginx` | `dnf search nginx` | `yum search nginx` | `pacman -Ss nginx` | | 查看包信息 | `apt show nginx` | `dnf info nginx` | `yum info nginx` | `pacman -Si nginx` | | 清理缓存 | `sudo apt clean` | `sudo dnf clean all` | `sudo yum clean all` | `sudo pacman -Sc` | 真正需要特别记住的是几个差异点:现代 RHEL 系优先 DNF,Ubuntu 脚本优先 apt-get,Arch 不做部分升级,第三方仓库和 AUR 要谨慎使用。
服务端6月21日 21:41
Linux 系统日志怎么查看、分析与轮转?## Linux 日志通常放在哪里? Linux 排查问题,第一步往往不是重启服务,而是看日志。不同发行版路径略有差异,但大多数传统日志都在 `/var/log` 下。 常见路径:Debian/Ubuntu 系统综合日志是 `/var/log/syslog`,认证日志是 `/var/log/auth.log`;RHEL/CentOS/Rocky 常见 `/var/log/messages` 和 `/var/log/secure`。Web 服务日志常见 `/var/log/nginx/`、`/var/log/apache2/` 或 `/var/log/httpd/`。 很多新系统同时使用 systemd-journald。一部分日志在 `/var/log/*.log` 里,另一部分可以通过 `journalctl` 查询。 ## 如何快速查看日志文件? ```bash less /var/log/syslog tail -n 100 /var/log/syslog tail -f /var/log/syslog zgrep -i error /var/log/syslog.*.gz ``` `less` 适合翻页查看,按 `/关键词` 搜索;`tail -f` 适合实时跟踪;压缩日志可以直接用 `zgrep`,不必先解压。 ## 如何用 grep 分析日志? ```bash grep -i 'error' /var/log/syslog grep -E 'error|failed|timeout|denied' /var/log/syslog grep 'Failed password' /var/log/auth.log grep -i 'timeout' /var/log/syslog | wc -l ``` 如果日志量很大,先缩小范围再搜索。比如先按日期、小时、服务名过滤,再找错误关键词。 ## journalctl 怎么用? ```bash journalctl -u nginx journalctl -u nginx -n 100 journalctl -u nginx -f journalctl --since '1 hour ago' journalctl -b journalctl -b -1 journalctl -p err journalctl -k ``` `journalctl -u` 看服务,`-f` 实时跟踪,`--since` 按时间过滤,`-b` 看当前启动批次,`-b -1` 看上次启动,`-p` 按级别过滤,`-k` 看内核日志。 开启持久化 journal,可创建 `/var/log/journal` 并配置 `/etc/systemd/journald.conf`: ```ini [Journal] Storage=persistent SystemMaxUse=1G MaxRetentionSec=1month ``` 查看和清理占用: ```bash journalctl --disk-usage journalctl --vacuum-time=14d journalctl --vacuum-size=1G ``` ## 如何配置 logrotate? 日志不能无限增长。`logrotate` 用来按时间、大小、保留数量压缩和删除旧日志。 ```conf /var/log/myapp/*.log { daily rotate 14 missingok notifempty compress delaycompress dateext create 0640 www-data adm sharedscripts postrotate systemctl reload myapp >/dev/null 2>&1 || true endscript } ``` 测试配置: ```bash logrotate -d /etc/logrotate.conf logrotate -f /etc/logrotate.conf ``` `copytruncate` 会复制当前日志再截断原文件,不需要 reload 服务,但复制和截断之间可能丢日志。能让服务重新打开日志,就优先用 `postrotate`;实在做不到,再考虑 `copytruncate`。 ## 权限、磁盘和结构化日志 日志里可能包含 IP、用户名、请求参数、错误堆栈甚至 token。权限太宽会变成安全问题,权限太严服务又可能写不进去。logrotate 里的 `create 0640 user group` 很关键。 日志撑满磁盘时,用: ```bash df -h du -sh /var/log/* journalctl --disk-usage lsof | grep deleted ``` 不要直接 `rm` 正在被进程写入的日志文件,文件名消失了,但进程可能仍持有旧文件句柄,空间不会立刻释放。 JSON 日志可以用 `jq` 分析: ```bash cat app.log | jq 'select(.level == "error")' cat app.log | jq -r '.path' | sort | uniq -c | sort -nr ``` 建议至少包含 timestamp、level、service、trace_id/request_id、message、error 等字段。 ## 远程日志和排查流程 机器多了之后,只靠 SSH 上去 `grep` 很痛苦。常见做法是用 rsyslog、syslog-ng、Filebeat、Fluent Bit、Vector、Logstash,把日志送到 Elasticsearch、OpenSearch、Loki、ClickHouse 或云厂商日志服务。远程日志要注意时间同步、字段规范和脱敏。 遇到线上问题,可以按这个顺序:确认时间和影响范围;看服务日志;看系统和认证日志;看内核和 OOM;看日志是否还在写入;查轮转和磁盘。不要只盯一个日志文件。把服务日志、系统日志、内核日志、磁盘占用、权限和轮转配置连起来看,问题通常会更快露出头。
服务端6月21日 21:41
Linux cron 时间格式怎么写?常用命令和最佳实践有哪些?## cron 是什么,适合解决什么问题? cron 是 Linux/Unix 系统里最常见的定时任务工具,适合做周期性、可重复、对秒级精度要求不高的任务,比如清理日志、备份文件、同步数据、定时拉取接口、跑统计脚本。 它的特点是简单、稳定、系统内置;缺点是默认环境变量很少、日志不集中、任务错过后通常不会自动补跑。所以写 cron 任务时,不只要会写时间表达式,还要处理路径、日志、锁、时区和失败通知。 ## cron 时间格式怎么写? 普通用户的 crontab 通常是 5 个时间字段加一条命令: ```bash * * * * * command # 分 时 日 月 周 命令 ``` 常见例子: ```bash 30 2 * * * /usr/local/bin/backup.sh # 每天 2:30 */5 * * * * /usr/local/bin/check.sh # 每 5 分钟 0 9 * * 1 /usr/local/bin/weekly-report.sh # 每周一 9 点 ``` 常用符号包括:`*` 任意值,`,` 多个值,`-` 范围,`/` 步长。 ## 日期和星期同时写时有什么坑? 在很多 cron 实现里,日期字段 day-of-month 和星期字段 day-of-week 如果同时被限制,通常是“或”的关系,不是“且”的关系”。 ```bash 0 9 1 * 1 /usr/local/bin/job.sh ``` 很多人以为它表示“每月 1 号且是周一的 9 点执行”。实际上通常表示每月 1 号 9 点执行,周一 9 点也执行。如果真的要表达“每月 1 号并且是周一”,建议在脚本里再判断一次。 ## crontab 常用命令有哪些? ```bash crontab -e # 编辑当前用户任务 crontab -l # 查看当前用户任务 crontab -r # 删除当前用户所有任务 sudo crontab -u nginx -e sudo crontab -u nginx -l ``` 编辑前建议先备份: ```bash crontab -l > ~/crontab.bak ``` 用户 crontab 的格式是 `* * * * * command`;`/etc/crontab` 和 `/etc/cron.d/` 里的格式通常多一个运行用户字段:`* * * * * user command`。不要混用。 ## cron 的环境变量为什么经常出问题? cron 执行命令时,不会加载完整交互式 shell 环境。建议在 crontab 顶部显式写清楚: ```bash SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MAILTO=admin@example.com ``` 命令和脚本尽量用绝对路径,需要进入项目目录时显式 `cd`。 ```bash */10 * * * * cd /data/app && /usr/bin/python3 scripts/sync.py >> /var/log/sync.log 2>&1 ``` ## 日志和防重入怎么做? cron 自身日志位置和发行版有关:Debian/Ubuntu 常见 `grep CRON /var/log/syslog`,RHEL/CentOS 常见 `grep CRON /var/log/cron`,systemd 系统也可以看 `journalctl -u cron` 或 `journalctl -u crond`。 生产环境建议自己重定向日志: ```bash 0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 ``` 如果任务执行时间比调度间隔还长,会出现多个实例同时运行。最简单可靠的办法是用 `flock` 加锁: ```bash */5 * * * * flock -n /var/lock/sync.lock /usr/local/bin/sync.sh >> /var/log/sync.log 2>&1 ``` ## cron 和时区有什么关系? cron 按系统时区执行。先确认服务器时区: ```bash date timedatectl ``` 部分 cron 实现支持在 crontab 中设置 `CRON_TZ`: ```bash CRON_TZ=Asia/Shanghai 0 9 * * * /usr/local/bin/report.sh ``` 跨地区部署时,最好把服务器时区、业务时区和任务说明写清楚。对账、结算、计费这类任务,还要做幂等和日期校验,不要只相信 cron 调度。 ## anacron 和 systemd timer 怎么选? cron 假设机器一直开着。如果电脑或服务器在计划时间关机,任务通常就错过了。anacron 适合每天、每周、每月这类低频任务,错过后下次开机补跑。 systemd timer 更适合生产服务化任务,它日志进 journald,可声明用户、工作目录、依赖和错过补跑。一个 timer 通常由 `.service` 和 `.timer` 两个文件组成。 ```ini # /etc/systemd/system/report.timer [Timer] OnCalendar=*-*-* 02:30:00 Persistent=true ``` 启用: ```bash sudo systemctl daemon-reload sudo systemctl enable --now report.timer systemctl list-timers journalctl -u report.service ``` 简单任务用 cron,生产任务需要状态、日志、依赖、告警时优先考虑 systemd timer。 ## cron 最佳实践清单 使用绝对路径;显式设置 `SHELL` 和 `PATH`;保存日志;用 `flock` 防重入;脚本要幂等;区分用户 crontab 和系统 cron;注意日期和星期字段的“或”关系;确认时区;复杂逻辑写进脚本;关键任务配置告警。 cron 本身不复杂,真正让任务稳定的是这些细节:命令能不能找到,失败能不能看见,重复执行会不会出事,时间是不是你以为的那个时间。
服务端6月21日 21:21
KVM、Docker、Kubernetes 有什么区别?适合哪些使用场景?KVM 是 Linux 上的全虚拟化方案,Docker 是容器运行与镜像分发方案,Kubernetes 严格来说不是虚拟化技术,而是容器编排平台。三者常被放在一起比较,是因为它们都能解决“如何把应用隔离、部署和迁移”的问题,但隔离层级完全不同:KVM 隔离到操作系统内核,Docker 容器共享宿主机内核,Kubernetes 负责把大量容器调度到多台机器上运行。 ## KVM 适合什么场景? KVM 把 Linux 内核变成 Hypervisor,通过 CPU 的 VT-x、AMD-V 等硬件虚拟化能力运行完整虚拟机。每个虚拟机都有自己的内核、磁盘、网卡和系统环境,隔离性强,适合多租户、强安全边界、不同操作系统混跑等场景。 实际使用 KVM 时,常见组合是 KVM + QEMU + libvirt:KVM 提供内核级虚拟化能力,QEMU 负责设备模拟与用户态辅助,libvirt 提供统一管理接口,方便创建、迁移、快照和管理虚拟机。 KVM 的优点是隔离强、兼容性好,能运行完整 Linux、Windows 或其他系统;缺点是启动慢、资源开销比容器高。它更适合云主机、私有云、测试不同操作系统、需要强隔离的生产环境。 ## Docker 适合什么场景? Docker 属于容器技术,不是完整虚拟机。容器通过 namespace、cgroups、联合文件系统等机制隔离进程、网络、文件系统和资源配额,但所有容器共享宿主机内核。 这意味着 Docker 启动很快,镜像分发方便,资源开销低,适合微服务、CI/CD、开发环境一致性、快速扩缩容等场景。比如一台机器上运行多个服务实例,用 Docker 比开多台虚拟机轻得多。 但共享内核也带来边界问题:容器隔离弱于虚拟机,内核漏洞可能影响所有容器。因此 Docker 适合应用级隔离,不适合把它当成完全等价于虚拟机的安全边界。 ## Kubernetes 为什么不是虚拟化? Kubernetes 不直接提供虚拟化能力,它负责容器编排。它关注的是:容器应该运行在哪台机器上,副本数是否足够,服务如何发现,失败后如何重启,滚动更新如何执行。 在生产环境里,Kubernetes 通常运行在物理机、虚拟机或云主机之上,再调度 Docker、containerd 等运行时管理的容器。它解决的是集群规模下的部署、调度、伸缩和自愈问题,而不是替代 KVM 或 Docker。 ## LXC、Xen、VMware 和它们有什么关系? LXC 更接近 Linux 原生容器,Docker 在镜像、仓库、构建和应用分发上做了更多工程化封装。 Xen 和 VMware 与 KVM 一样属于虚拟机方向。Xen 是传统 Type-1 Hypervisor,VMware 在企业虚拟化里成熟度很高;KVM 的优势是深度集成 Linux 内核,生态开放,常见于 OpenStack、云平台和私有云环境。 ## 网络、存储、性能和安全怎么比较? | 技术 | 隔离级别 | 性能开销 | 网络与存储特点 | 典型场景 | |---|---|---|---|---| | KVM | 完整虚拟机,独立内核 | 中等 | 虚拟网卡、虚拟磁盘、可接 Ceph/NFS/iSCSI | 云主机、强隔离、多系统环境 | | Docker | 进程级隔离,共享内核 | 很低 | bridge、host、overlay 网络,卷挂载与镜像层 | 微服务、CI/CD、快速交付 | | Kubernetes | 编排容器,不是虚拟化 | 取决于底层容器和集群 | CNI 管网络,CSI 管存储 | 大规模容器调度、弹性伸缩 | | LXC | 系统容器,共享内核 | 低 | 更像轻量 Linux 系统环境 | 轻量系统隔离、实验环境 | | Xen/VMware | 完整虚拟化 | 中等 | 企业级虚拟网络和共享存储成熟 | 企业虚拟化、传统数据中心 | 如果重点是性能,容器通常比虚拟机轻;如果重点是安全隔离,KVM、Xen、VMware 这类虚拟机更稳妥;如果重点是大规模服务治理,就需要 Kubernetes 管理容器集群。 ## 如何选择? 单机运行多个应用、希望环境一致,用 Docker。要管理几十台甚至几百台机器上的容器,用 Kubernetes。需要运行不同操作系统、给不同租户提供强隔离环境,用 KVM、Xen 或 VMware。 更常见的生产组合不是三选一,而是叠加使用:底层用 KVM 提供云主机,上层用 Kubernetes 管理容器,应用通过 Docker/containerd 镜像交付。这样既有虚拟机的隔离边界,也有容器的交付效率和 Kubernetes 的集群调度能力。
服务端6月21日 21:21
Linux 内核参数调优常用网络内存参数有哪些?## Linux 内核参数调优先看什么? Linux 内核参数调优常见入口是 `sysctl`,参数主要分布在网络、内存、文件系统、进程资源和安全几个方向。它不是把网上的配置复制一遍就完事,而是要结合业务负载、机器规格、连接量、磁盘类型和监控数据逐项验证。 最稳妥的做法是:先记录当前值,再小步修改,观察指标,最后写入 `/etc/sysctl.d/*.conf` 持久化。 ```bash sysctl net.core.somaxconn sysctl -w net.core.somaxconn=4096 sysctl -a | grep tcp ``` 持久化示例: ```bash cat >/etc/sysctl.d/99-app-tuning.conf <<'EOF' net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 8192 vm.swappiness = 10 fs.file-max = 2097152 EOF sysctl --system ``` ## 网络参数常调哪些? 网络参数通常是 Web 服务、网关、长连接服务最先碰到的瓶颈。重点看监听队列、半连接队列、缓冲区、Keepalive、端口范围和 SYN 防护。 `net.core.somaxconn` 控制监听 socket 的最大连接队列上限。Nginx、Node.js、Java 服务的 backlog 即使设置得很大,也会被这个内核上限截断。`net.ipv4.tcp_max_syn_backlog` 控制 TCP 半连接队列大小。突发连接多、握手阶段排队明显时,这个参数很关键。 ```conf net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_syncookies = 1 ``` 吞吐量高、跨机房传输、延迟较大的链路,常会调整收发缓冲区: ```conf net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 ``` 长连接服务常调 TCP Keepalive: ```conf net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 5 ``` 高并发短连接场景要关注本地临时端口范围和 TIME_WAIT: ```conf net.ipv4.ip_local_port_range = 10240 65535 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1 ``` 需要特别注意:`net.ipv4.tcp_tw_recycle` 已经在新内核中移除,老资料里还会看到它,但线上应避免使用。它和 NAT 环境兼容性很差,可能导致同一出口后的客户端连接异常。 ## 内存参数常调哪些? `vm.swappiness` 控制内核使用 swap 的倾向,值越高越容易换出匿名页。数据库、缓存、延迟敏感服务通常会把它调低,例如 1-10。 ```conf vm.swappiness = 10 ``` 脏页参数决定文件写入后什么时候触发后台回写、什么时候阻塞前台写入: ```conf vm.dirty_background_ratio = 5 vm.dirty_ratio = 20 ``` 大内存机器也可以使用字节级参数,让阈值更可控: ```conf vm.dirty_background_bytes = 268435456 vm.dirty_bytes = 1073741824 ``` 内存超分相关参数: ```conf vm.overcommit_memory = 0 vm.overcommit_ratio = 50 ``` Redis、数据库、大型 JVM 服务要谨慎修改,避免 fork、AOF rewrite、备份任务时因为内存承诺失败而出问题。 HugePages 适合部分数据库、虚拟化或高性能计算场景: ```conf vm.nr_hugepages = 1024 ``` 它能减少页表开销,但也会预留固定内存。不是所有服务都能受益,配置前要确认应用是否支持。 ## 文件系统与进程参数有哪些? 高并发服务常见报错是 `Too many open files`,这通常不只和应用有关,也和系统文件句柄上限有关。 ```conf fs.file-max = 2097152 fs.nr_open = 1048576 ``` 实际还要配合 `ulimit -n`、systemd 的 `LimitNOFILE`、容器运行参数一起看。 inotify 适合文件监听多的场景,例如前端构建、日志采集、配置中心 Agent: ```conf fs.inotify.max_user_watches = 524288 fs.inotify.max_user_instances = 1024 fs.inotify.max_queued_events = 32768 ``` 数据库或存储服务使用 native AIO 时,可关注: ```conf fs.aio-max-nr = 1048576 ``` 进程数、线程数、共享内存和信号量在数据库、中间件、容器宿主机上比较常见: ```conf kernel.pid_max = 4194304 kernel.threads-max = 2060000 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 kernel.sem = 250 32000 100 128 ``` ## 安全相关参数有哪些? 安全参数不能为了“能连通”随意关闭,尤其是边界机器、网关、云主机。 ```conf net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 kernel.dmesg_restrict = 1 kernel.kptr_restrict = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 ``` `rp_filter` 可减少 IP 欺骗风险,但多网卡、多出口、策略路由场景可能需要按网卡单独调整。 ## 如何按业务负载调优? Web 网关通常优先看 `somaxconn`、`tcp_max_syn_backlog`、端口范围、Keepalive、文件句柄。数据库通常优先看 swappiness、dirty 参数、overcommit、HugePages、aio、共享内存和信号量。容器宿主机通常关注文件句柄、inotify、PID/线程上限、网络 backlog、conntrack 与 cgroup 限制。 修改后要验证: ```bash sysctl net.core.somaxconn vm.swappiness fs.file-max ss -s cat /proc/sys/fs/file-nr vmstat 1 iostat -x 1 dmesg -T | tail journalctl -k -n 100 ``` 内核参数调优的结果应该能在监控里看到,而不是只停留在配置文件里。真正可靠的调优,是知道每个参数影响什么、适合什么负载、修改后用什么指标验证,并且能快速回滚。
服务端6月21日 02:14
Linux ulimit 如何配置资源限制并排查常见问题?Linux 里的 `ulimit` 用来限制一个 shell 以及它启动的子进程能使用多少系统资源。它最常见的用途,是防止某个程序打开太多文件、创建太多进程、占用过多栈空间,或者在崩溃时不生成 core 文件。 不过 `ulimit` 容易被误解:你在命令行里执行 `ulimit -n 65535`,只影响当前 shell 和它后面启动的进程;已经运行的服务不会自动改变;由 systemd 管理的服务,也不会因为你改了 `/etc/security/limits.conf` 就一定生效。 ## ulimit 到底限制什么? `ulimit` 本质上是 shell 内置命令,用来查看或设置进程资源限制。最重要的两个概念是软限制和硬限制。 - **软限制(soft limit)**:当前实际生效的限制,普通用户通常可以调低,也可以在不超过硬限制的前提下调高。 - **硬限制(hard limit)**:软限制的上限,普通用户不能随便提高,通常需要 root 或具备相应权限的进程调整。 ```bash ulimit -Sn # 查看 soft nofile ulimit -Hn # 查看 hard nofile ulimit -a # 查看全部限制 ``` ## 常用 ulimit 命令有哪些? | 命令 | 含义 | 常见场景 | |---|---|---| | `ulimit -n` | 最大打开文件数,等价于 nofile | Nginx、数据库、高并发连接 | | `ulimit -u` | 最大用户进程数,等价于 nproc | 防止进程或线程创建过多 | | `ulimit -s` | 栈大小,等价于 stack | 递归过深、线程栈配置 | | `ulimit -c` | core 文件大小,等价于 core | 程序崩溃排查 | | `ulimit -l` | 最大锁定内存,等价于 memlock | 数据库、DPDK、实时程序 | | `ulimit -v` | 最大虚拟内存 | 限制进程虚拟地址空间 | | `ulimit -t` | 最大 CPU 时间 | 限制 CPU 占用时间 | | `ulimit -f` | 最大文件大小 | 防止写出超大文件 | 临时把最大打开文件数调到 65535: ```bash ulimit -n 65535 ``` 启用 core 文件: ```bash ulimit -c unlimited ``` 这类命令只对当前 shell 和它之后启动的子进程有效。 ## nofile、nproc、stack、core、memlock 分别怎么用? `nofile` 控制一个进程最多能打开多少文件描述符。这里的“文件”不只是普通文件,还包括 socket、pipe、epoll fd 等。Web 服务、网关、数据库经常需要调大它。连接数一高,最先遇到的往往就是 `Too many open files`。 `nproc` 限制用户最多能拥有多少个进程。很多时候线程也会受到这个限制影响,所以 Java、Go、数据库或高并发程序创建线程失败时,也要检查它。 `stack` 控制进程线程栈大小。栈太小,递归深、局部变量大、线程模型复杂的程序可能崩溃;栈太大,又会让大量线程浪费地址空间。 `core` 控制程序崩溃时能否生成 core dump。core 文件还受系统 core_pattern、工作目录权限、磁盘空间、systemd-coredump 等因素影响,不能只看 `ulimit -c`。 `memlock` 控制进程最多能锁定多少内存,数据库、实时计算、DPDK、Elasticsearch 某些配置会关注它。 ## limits.conf 的格式怎么写? 永久配置通常写到 `/etc/security/limits.conf` 或 `/etc/security/limits.d/*.conf`。 格式是: ```conf <domain> <type> <item> <value> ``` 常见配置: ```conf * soft nofile 65535 * hard nofile 65535 username soft nproc 4096 username hard nproc 8192 @groupname soft memlock 1048576 @groupname hard memlock 2097152 * soft core unlimited * hard core unlimited ``` `domain` 可以是 `*`、用户名、`@组名`;`type` 可以是 `soft`、`hard`、`-`;`item` 是 `nofile`、`nproc`、`stack`、`core`、`memlock` 等;`value` 是限制值或 `unlimited`。 生产环境里推荐把 soft、hard 分开写,便于排查到底哪个值没有生效。 ## 为什么改了 limits.conf 还是没生效? `/etc/security/limits.conf` 主要通过 PAM 的 `pam_limits.so` 在用户登录会话中生效。也就是说,它通常影响 SSH 登录、su、login 等 PAM 会话。 但 systemd 管理的服务不一定走这种登录链路。你改了 `limits.conf`,然后执行 `systemctl restart nginx`,Nginx 的限制值未必会变。systemd 服务应该用自己的配置方式。 ## systemd 服务如何设置 ulimit? 推荐用 drop-in 文件,不要直接改发行版自带的 service 文件。 ```bash sudo systemctl edit nginx ``` 写入: ```ini [Service] LimitNOFILE=65535 LimitNPROC=4096 LimitCORE=infinity LimitMEMLOCK=infinity ``` 保存后执行: ```bash sudo systemctl daemon-reload sudo systemctl restart nginx ``` 再查看实际进程限制: ```bash cat /proc/$(pidof nginx | awk '{print $1}')/limits ``` systemd 里常用 `infinity` 表示无限制,而 `limits.conf` 里常用 `unlimited`。 ## 如何查看正在运行进程的真实限制? 不要只看当前终端的 `ulimit -a`。它只能说明当前 shell 的限制,不能代表某个服务进程。 ```bash cat /proc/PID/limits ls /proc/PID/fd | wc -l ps -eLf | grep PID | wc -l ``` 如果要临时查看或调整某个已运行进程的限制,可以用 `prlimit`: ```bash prlimit --pid PID prlimit --pid PID --nofile=65535:65535 ``` `prlimit` 适合临时救急或验证问题,但生产配置还是应该落到 systemd drop-in、limits.d 或应用启动脚本里,避免重启后丢失。 ## fs.file-max 和 ulimit -n 是什么关系? `ulimit -n` 控制的是单个进程的最大打开文件数。`fs.file-max` 控制的是整个系统层面的文件句柄上限。 ```bash cat /proc/sys/fs/file-max cat /proc/sys/fs/file-nr sysctl -w fs.file-max=2097152 ``` 如果单个进程的 `nofile` 很小,会先撞到 `Too many open files`;如果系统整体文件句柄耗尽,多个进程都可能异常。两者不是一个层面的限制,排查时要分开看。 ## 常见故障怎么排查? 遇到 `Too many open files`,先确认是哪一层不够: ```bash cat /proc/PID/limits | grep "open files" ls /proc/PID/fd | wc -l cat /proc/sys/fs/file-nr ``` 如果进程 fd 数接近 `Max open files`,调大 `nofile`。如果是 systemd 服务,要配置 `LimitNOFILE=`,而不是只改当前 shell 的 `ulimit -n`。 core 文件没有生成时,检查 `ulimit -c`、`/proc/PID/limits`、`/proc/sys/kernel/core_pattern`、目录权限和磁盘空间。 进程或线程创建失败时,重点看 `nproc`。内存相关报错还要一起检查系统内存、cgroup 限制、容器限制、swap、overcommit 策略。 ## 配置 ulimit 的最佳实践 先看真实进程限制,优先用 `/proc/PID/limits`。区分临时和永久:命令行 `ulimit` 适合临时验证,长期配置要落到配置文件。区分登录用户和服务:PAM 登录会话看 `limits.conf` / `limits.d`,systemd 服务看 `LimitNOFILE=`、`LimitNPROC=` 等 drop-in 配置。 不要盲目写 `unlimited`。`core`、`memlock`、`nofile` 都可能影响系统稳定性或磁盘空间。配置完必须重启服务并用 `/proc/PID/limits` 确认,而不是相信配置文件已经生效。 简单记住一句话:`ulimit` 管的是进程资源上限;`limits.conf` 多数影响 PAM 登录会话;systemd 服务要用 `Limit*` 配置;排查时以 `/proc/PID/limits` 看到的值为准。
服务端6月3日 00:11
Linux 启动流程是怎样的?从 BIOS 到 login 的完整过程Linux 启动分五个阶段:固件(BIOS/UEFI)→ 引导加载器(GRUB)→ 内核 → init 系统(systemd)→ 用户登录。每个阶段接力完成,任一阶段失败系统就无法启动。 ## 1. 固件阶段:BIOS/UEFI 按下电源键后,CPU 执行固件(烧在主板 ROM 里的程序): - **BIOS**(传统):POST 自检 → 扫描启动设备 → 读取第一个扇区(MBR,512 字节) - **UEFI**(现代):POST 自检 → 读取 EFI 系统分区(ESP)里的 .efi 引导程序 UEFI 比 BIOS 快(跳过 MBR 扫描),支持 GPT 分区(超过 2TB 磁盘),支持安全启动(Secure Boot)。新机器都是 UEFI。 ## 2. 引导加载器:GRUB2 GRUB2 显示启动菜单(如果有多个内核或系统),然后加载 Linux 内核和 initramfs 到内存: ``` GRUB 菜单 ├── Ubuntu, Linux 6.5.0-generic ├── Ubuntu, Linux 6.5.0-generic (recovery) └── Advanced options ``` GRUB 的配置在 /boot/grub/grub.cfg。修改用 update-grub 命令,不要直接编辑。 ## 3. 内核阶段 内核加载后: 1. 解压 initramfs(临时根文件系统,包含基本驱动) 2. 检测硬件,加载驱动模块 3. 挂载真正的根文件系统(/) 4. 执行 /sbin/init(PID 1) 内核启动时的日志用 dmesg 查看。如果卡在某个驱动加载,dmesg 能看到最后一条。 ## 4. init 系统:systemd 现代 Linux 都用 systemd(取代了旧的 SysV init)。systemd 按 target(目标单元)组织启动流程: ``` sysinit.target # 基础系统初始化 ↓ multi-user.target # 多用户模式(无图形界面) ↓ graphical.target # 图形界面 ``` 每个 target 下有多个 service 并行启动(不像旧 init 串行),启动速度更快。 查看启动耗时: ```bash systemd-analyze # 总耗时 systemd-analyze blame # 各服务耗时排序 ``` ## 5. 用户登录 - **文本模式**:getty 进程在 tty1-6 显示登录提示 - **图形模式**:GDM/LightDM/SDDM 显示管理器显示登录界面 登录后: 1. 验证用户密码(/etc/shadow) 2. 启动用户 shell(/bin/bash 或 /bin/zsh) 3. 执行 shell 配置文件(.bashrc/.zshrc) 4. 用户进入系统 ## 常见启动故障 **卡在 GRUB**:内核或 initramfs 损坏。用 Live USB chroot 修复:grub-install + update-grub。 **卡在内核阶段**:驱动问题。启动时在 GRUB 菜单按 e 编辑,在 linux 行末加 nomodeset 禁用图形驱动。 **卡在 systemd**:某个服务启动失败。systemctl status 查看失败服务,systemctl disable 暂时禁用。 **忘记密码**:GRUB 菜单按 e,linux 行末加 init=/bin/bash,Ctrl+X 启动到 root shell,passwd 修改密码。
服务端6月3日 00:11
Linux 管道和重定向怎么用?| > >> 2>&1 详解管道(|)把一个命令的输出传给另一个命令做输入。重定向(> >> 2>&1)控制输出到文件还是设备。两者配合是 Linux 命令行最核心的组合能力。 ## 重定向 ### 标准输出重定向 ```bash ls > file.txt # 覆盖写入 ls >> file.txt # 追加写入 ``` > 会清空文件再写入,>> 在文件末尾追加。新手常犯的错:用 > 覆盖了重要文件。 ### 标准错误重定向 ```bash gcc main.c 2> errors.log # 只重定向错误 ``` Linux 有三个标准流:stdin(0)、stdout(1)、stderr(2)。2> 就是重定向文件描述符 2(标准错误)。 ### 同时重定向输出和错误 ```bash # 输出和错误都写到同一个文件 gcc main.c > output.log 2>&1 # 更简洁的写法(bash 4+) gcc main.c &> output.log ``` 2>&1 把 stderr 合并到 stdout。顺序重要:> output.log 2>&1 正确,2>&1 > output.log 错误(stderr 去了终端而不是文件)。 ### 丢弃输出 ```bash gcc main.c > /dev/null 2>&1 # 什么都不看 gcc main.c 2> /dev/null # 只看正常输出,忽略错误 ``` /dev/null 是黑洞设备,写入的数据全部丢弃。 ## 管道 ```bash # 找出占用内存最多的 5 个进程 ps aux | sort -k4 -rn | head -5 # 统计当前目录下各类型文件数量 ls | grep -o '\..*$' | sort | uniq -c | sort -rn # 在日志中搜索错误并提取时间 grep ERROR app.log | awk '{print $1, $2}' ``` 管道把前一个命令的 stdout 变成后一个命令的 stdin。注意:管道只传 stdout,不传 stderr。如果要传 stderr,先 2>&1。 ## 常见组合 ```bash # 查找大文件 du -sh * | sort -rh | head -10 # 统计代码行数 find . -name '*.py' | xargs wc -l | tail -1 # 批量替换文件内容 grep -rl 'old_text' . | xargs sed -i 's/old_text/new_text/g' # 监控日志中的错误 tail -f app.log | grep --line-buffered ERROR ``` ## Here Document ```bash cat > config.yaml << EOF server: port: 8080 host: localhost EOF ``` << EOF 把多行文本作为 stdin,常用于写配置文件或脚本内嵌数据。
服务端6月3日 00:11
Linux 系统怎么备份和恢复?rsync、tar 和快照实战Linux 备份分三个层级:文件级(rsync/tar)、分区级(dd)、快照级(LVM/Btrfs)。日常用 rsync 增量备份文件,关键系统用快照,dd 只在磁盘克隆时用。 ## rsync:增量备份首选 rsync 只传输变化的文件,第一次全量,之后只传差异部分: ```bash # 本地备份到外部硬盘 rsync -avz --delete /home/user/ /backup/home/ # 远程备份到服务器 rsync -avz --delete /home/user/ user@server:/backup/home/ ``` 参数:-a 保留权限和时间戳,-v 显示进度,-z 压缩传输,--delete 删除目标中源端已不存在的文件(保持完全同步)。 定时备份: ```bash # 每天凌晨 2 点备份 0 2 * * * rsync -avz --delete /home/user/ /backup/home/ >> /var/log/backup.log 2>&1 ``` ## tar:打包归档 ```bash # 打包并压缩 tar czf backup_$(date +%Y%m%d).tar.gz /home/user/ # 解压恢复 tar xzf backup_20240101.tar.gz -C / ``` tar 适合归档到单个文件(方便传输和存储),但不支持增量。每次都全量打包,大目录慢。 ## dd:磁盘级克隆 ```bash # 整盘克隆 dd if=/dev/sda of=/dev/sdb bs=4M status=progress # 克隆到镜像文件 dd if=/dev/sda of=disk.img bs=4M status=progress ``` dd 逐扇区复制,包含分区表和引导扇区。用途:换硬盘时整盘克隆。缺点:必须卸载分区或用 Live USB,否则数据不一致。 ## LVM 快照 LVM 快照冻结文件系统某一时刻的状态,备份时不需要停服务: ```bash # 创建快照 lvcreate -L 10G -s -n snap_root /dev/vg0/root # 挂载快照并备份 mount /dev/vg0/snap_root /mnt/snap rsync -avz /mnt/snap/ /backup/root/ # 备份完成后删除快照 umount /mnt/snap lvremove /dev/vg0/snap_root ``` 快照不是备份——如果硬盘坏了快照也没了。快照的意义是:在不停服务的情况下获得一致的文件系统状态。 ## 备份策略:3-2-1 原则 - **3** 份数据副本 - **2** 种不同存储介质(本地硬盘 + NAS) - **1** 份离线/远程(云存储) 最小化方案:rsync 到本地 NAS + 推到 S3。两步覆盖 3-2-1。 ## 恢复测试 没测过的备份等于没备份。定期恢复测试: ```bash # 随机抽取一个文件验证 tar tzf backup.tar.gz | head -5 rsync -avzn /backup/home/ /tmp/verify/ # dry-run 验证 ``` 每季度做一次完整恢复演练——把备份恢复到新机器,确认能正常工作。
服务端2月17日 23:38
Linux 磁盘管理和文件系统操作中如何进行分区、格式化、挂载和管理磁盘空间?Linux 磁盘管理和文件系统是系统管理员的核心技能,涉及磁盘分区、格式化、挂载和维护等操作。 磁盘分区: - fdisk:传统的磁盘分区工具 - 查看分区:fdisk -l - 进入交互模式:fdisk /dev/sdb - 常用命令:n(新建分区)、p(打印分区表)、d(删除分区)、w(保存并退出)、q(不保存退出) - parted:现代磁盘分区工具,支持 GPT 分区表 - 查看分区:parted -l - 进入交互模式:parted /dev/sdb - 创建分区:mkpart primary ext4 1MiB 100% - 设置分区表:mklabel gpt - lsblk:列出块设备信息 - blkid:查看块设备 UUID 和文件系统类型 文件系统: - 常见文件系统类型:ext4、xfs、btrfs、ntfs、vfat - mkfs:创建文件系统,如 mkfs.ext4 /dev/sdb1、mkfs.xfs /dev/sdb1 - mkfs.ext4:创建 ext4 文件系统 - mkfs.xfs:创建 xfs 文件系统 磁盘挂载: - mount:挂载文件系统,如 mount /dev/sdb1 /mnt/data - umount:卸载文件系统,如 umount /mnt/data - 查看挂载点:mount、df -h - /etc/fstab:自动挂载配置文件 - 格式:设备 挂载点 文件系统类型 挂载选项 dump fsck - 示例:/dev/sdb1 /mnt/data ext4 defaults 0 2 - 使用 UUID:UUID=xxx /mnt/data ext4 defaults 0 2(推荐) - 查看设备 UUID:blkid /dev/sdb1 磁盘空间管理: - df:查看磁盘空间使用情况,df -h(人类可读格式) - du:查看目录或文件大小,du -sh directory(显示目录总大小) - du -h --max-depth=1 /:查看根目录下各目录的大小 - 清理磁盘空间: - 清理包缓存:apt clean(Debian/Ubuntu)、yum clean all(CentOS/RHEL) - 清理旧日志:logrotate - 查找大文件:find / -type f -size +100M LVM(逻辑卷管理): - pvcreate:创建物理卷,如 pvcreate /dev/sdb1 - vgcreate:创建卷组,如 vgcreate vgname /dev/sdb1 - lvcreate:创建逻辑卷,如 lvcreate -L 10G -n lvname vgname - lvextend:扩展逻辑卷,如 lvextend -L +5G /dev/vgname/lvname - lvreduce:缩减逻辑卷,如 lvreduce -L -5G /dev/vgname/lvname - resize2fs:调整 ext4 文件系统大小,如 resize2fs /dev/vgname/lvname - xfs_growfs:扩展 xfs 文件系统 - pvdisplay、vgdisplay、lvdisplay:查看物理卷、卷组、逻辑卷信息 RAID(磁盘阵列): - mdadm:管理软件 RAID - 创建 RAID 0:mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1 - 创建 RAID 1:mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 - 创建 RAID 5:mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 - 查看 RAID 状态:cat /proc/mdstat、mdadm --detail /dev/md0 磁盘性能优化: - 使用 SSD:提高 I/O 性能 - 调整 I/O 调度器:echo deadline > /sys/block/sda/queue/scheduler - 增加文件系统块大小:mkfs.ext4 -b 4096 /dev/sdb1 - 使用 noatime 挂载选项:减少磁盘写入 - 启用文件系统日志:提高数据安全性 磁盘故障排查: - 查看磁盘健康:smartctl -a /dev/sda(需要安装 smartmontools) - 查看磁盘 I/O:iostat -x 1 - 查看磁盘错误:dmesg | grep -i error - 修复文件系统:fsck /dev/sdb1(需要先卸载)
服务端2月17日 23:38
Linux Shell 脚本编程中如何定义变量、编写条件判断和循环语句?Linux Shell 脚本编程是自动化运维和系统管理的重要技能。 变量定义和使用: - 变量定义:name="value"(注意等号两边不能有空格) - 变量引用:$name 或 ${name} - 只读变量:readonly name - 删除变量:unset name - 环境变量:export name="value" - 特殊变量:$0(脚本名)、$1-$9(位置参数)、$#(参数个数)、$*(所有参数)、$@(所有参数)、$?(上一条命令退出状态)、$$(当前进程 PID)、$!(后台进程 PID) 条件判断: - if 语句:if [ condition ]; then commands; fi - 文件测试:-f(文件存在)、-d(目录存在)、-e(存在)、-r(可读)、-w(可写)、-x(可执行) - 字符串比较:=(等于)、!=(不等于)、-z(空字符串)、-n(非空字符串) - 数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于) - 逻辑运算:-a(与)、-o(或)、!(非) 循环结构: - for 循环:for i in {1..10}; do commands; done 或 for ((i=0; i<10; i++)); do commands; done - while 循环:while [ condition ]; do commands; done - until 循环:until [ condition ]; do commands; done 函数定义: - 函数定义:function_name() { commands; } 或 function function_name { commands; } - 函数调用:function_name arg1 arg2 - 返回值:return value(0-255) - 局部变量:local var="value" 常用命令: - echo:输出文本,echo -n 不换行,echo -e 解析转义字符 - printf:格式化输出 - read:读取用户输入,read -p "prompt" var - test:条件测试,[ ] 是 test 的同义词 - expr:表达式求值 - let:算术运算 - awk:文本处理工具 - sed:流编辑器 - grep:文本搜索 数组操作: - 定义数组:arr=(item1 item2 item3) - 访问元素:${arr[0]}、${arr[@]}(所有元素)、${#arr[@]}(元素个数) - 添加元素:arr+=("new_item") 最佳实践: - 使用 set -e 遇到错误立即退出 - 使用 set -u 使用未定义变量时报错 - 使用 set -o pipefail 管道中任何命令失败都返回失败 - 添加注释说明脚本用途 - 使用引号保护变量
服务端2月17日 23:37
Linux 容器技术(Docker、Kubernetes)的核心概念、常用命令和最佳实践有哪些?Linux 容器技术是现代应用部署和微服务架构的核心技术,Docker 和 Kubernetes 是最主流的容器解决方案。 Docker 基本概念: - 镜像(Image):只读的文件系统模板,包含运行应用所需的所有依赖 - 容器(Container):镜像的运行实例,轻量级、隔离的运行环境 - 仓库(Repository):存储和分发镜像的地方,如 Docker Hub - Dockerfile:用于构建镜像的文本文件 - Docker Compose:定义和运行多容器应用的工具 Docker 常用命令: - 镜像管理: - docker images:列出本地镜像 - docker pull image:拉取镜像 - docker build -t name .:构建镜像 - docker rmi image:删除镜像 - docker tag image newname:标记镜像 - 容器管理: - docker run:运行容器 - docker ps:查看运行中的容器 - docker ps -a:查看所有容器 - docker stop container:停止容器 - docker start container:启动容器 - docker restart container:重启容器 - docker rm container:删除容器 - docker exec -it container /bin/bash:进入容器 - 容器操作: - docker logs container:查看容器日志 - docker cp file container:/path:复制文件到容器 - docker cp container:/path file:从容器复制文件 - docker inspect container:查看容器详细信息 - docker stats:查看容器资源使用情况 Dockerfile 指令: - FROM:指定基础镜像 - RUN:执行命令 - COPY:复制文件到镜像 - ADD:复制文件到镜像(支持解压缩和 URL) - CMD:容器启动时执行的命令 - ENTRYPOINT:容器启动时执行的入口点 - ENV:设置环境变量 - ARG:构建时的变量 - EXPOSE:声明容器监听的端口 - VOLUME:声明挂载点 - WORKDIR:设置工作目录 - USER:设置运行用户 Docker Compose: - 配置文件:docker-compose.yml - 常用命令: - docker-compose up:启动服务 - docker-compose down:停止并删除服务 - docker-compose ps:查看服务状态 - docker-compose logs:查看服务日志 - docker-compose exec service command:在服务中执行命令 - 配置示例: ```yaml version: '3' services: web: build: . ports: - "80:80" volumes: - ./data:/data environment: - ENV=value ``` Kubernetes 基本概念: - Pod:最小的部署单元,包含一个或多个容器 - Node:运行 Pod 的物理或虚拟机 - Service:为 Pod 提供稳定的网络访问 - Deployment:管理 Pod 的副本和更新 - ReplicaSet:确保指定数量的 Pod 副本在运行 - StatefulSet:管理有状态应用 - DaemonSet:在每个节点上运行一个 Pod - ConfigMap:配置数据 - Secret:敏感数据 - Namespace:资源隔离 - Ingress:HTTP/HTTPS 路由 Kubernetes 常用命令: - 集群管理: - kubectl cluster-info:查看集群信息 - kubectl get nodes:查看节点 - kubectl get namespaces:查看命名空间 - Pod 管理: - kubectl get pods:查看 Pod - kubectl describe pod podname:查看 Pod 详情 - kubectl logs podname:查看 Pod 日志 - kubectl exec -it podname /bin/bash:进入 Pod - kubectl delete pod podname:删除 Pod - Service 管理: - kubectl get services:查看服务 - kubectl describe service servicename:查看服务详情 - Deployment 管理: - kubectl get deployments:查看部署 - kubectl apply -f yaml:应用配置 - kubectl rollout status deployment/deploymentname:查看部署状态 - kubectl scale deployment/deploymentname --replicas=3:扩展副本数 Kubernetes 配置示例: - Pod 配置: ```yaml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx ports: - containerPort: 80 ``` - Deployment 配置: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: mydeployment spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: mycontainer image: nginx ports: - containerPort: 80 ``` 容器网络: - Docker 网络模式: - bridge:默认模式,容器通过 Docker 网桥通信 - host:容器使用主机网络栈 - none:无网络 - container:共享另一个容器的网络 - Kubernetes 网络模型: - Pod 网络:所有 Pod 在同一个扁平网络中 - Service 网络:为 Pod 提供稳定的 IP - Ingress:外部访问入口 容器存储: - Docker 存储驱动:overlay2、aufs、btrfs、zfs - 卷(Volume):持久化存储 - 绑定挂载(Bind Mount):将主机目录挂载到容器 - Kubernetes 存储类(StorageClass):动态存储分配 - 持久卷(PersistentVolume):集群级别的存储资源 - 持久卷声明(PersistentVolumeClaim):用户对存储的请求 容器安全: - 镜像安全: - 使用官方镜像或可信镜像 - 定期更新镜像 - 扫描镜像漏洞 - 最小化镜像大小 - 运行时安全: - 使用非 root 用户运行容器 - 限制容器资源 - 使用只读文件系统 - 限制容器能力 - Kubernetes 安全: - RBAC:基于角色的访问控制 - Network Policy:网络策略 - Pod Security Policy:Pod 安全策略 容器编排最佳实践: - 微服务架构:将应用拆分为多个微服务 - 健康检查:配置 liveness 和 readiness 探针 - 资源限制:设置 CPU 和内存限制 - 滚动更新:逐步更新应用,避免服务中断 - 自动扩缩容:根据负载自动调整副本数 - 配置管理:使用 ConfigMap 和 Secret 管理配置 - 日志收集:集中收集和分析容器日志 - 监控告警:监控容器和集群状态
服务端2月17日 23:37
Linux 文本处理中 grep、sed、awk 命令的常用用法和正则表达式有哪些?Linux 文本处理是系统管理和数据分析的重要技能,掌握这些工具可以大大提高工作效率。 grep(文本搜索): - 基本用法:grep "pattern" file - 常用选项: - -i:忽略大小写 - -v:反向匹配(显示不匹配的行) - -n:显示行号 - -c:统计匹配行数 - -r:递归搜索目录 - -l:只显示包含匹配的文件名 - -A n:显示匹配行及其后 n 行 - -B n:显示匹配行及其前 n 行 - -C n:显示匹配行及其前后各 n 行 - 正则表达式:grep -E "pattern1|pattern2" file(扩展正则) - 示例:grep -rn "error" /var/log(递归搜索日志中的错误) sed(流编辑器): - 基本用法:sed 'command' file - 常用命令: - s/pattern/replacement/:替换(只替换第一个匹配) - s/pattern/replacement/g:全局替换(替换所有匹配) - d:删除行 - p:打印行 - n:读取下一行 - 常用选项: - -i:直接修改文件 - -n:抑制自动输出 - -e:执行多个命令 - 示例: - sed 's/old/new/g' file(全局替换) - sed '/pattern/d' file(删除匹配的行) - sed -i 's/foo/bar/g' file(直接修改文件) awk(文本处理工具): - 基本用法:awk 'pattern {action}' file - 内置变量: - $0:整行 - $1, $2, ...:第1、2、...个字段 - NF:字段总数 - NR:当前行号 - FNR:当前文件的行号 - FS:字段分隔符(默认空格) - OFS:输出字段分隔符 - RS:记录分隔符(默认换行符) - ORS:输出记录分隔符 - 常用函数: - print:打印 - printf:格式化输出 - length():字符串长度 - substr():子字符串 - split():分割字符串 - gsub():全局替换 - 示例: - awk '{print $1}' file(打印第一个字段) - awk -F: '{print $1, $3}' /etc/passwd(以冒号为分隔符) - awk 'NR==1,NR==10' file(打印第1-10行) - awk '{sum+=$1} END {print sum}' file(计算第一列总和) cut(剪切工具): - 基本用法:cut [options] file - 常用选项: - -d:指定分隔符 - -f:指定字段 - -c:指定字符位置 - 示例: - cut -d: -f1 /etc/passwd(以冒号为分隔符,提取第一个字段) - cut -c1-10 file(提取每行的前10个字符) sort(排序工具): - 基本用法:sort [options] file - 常用选项: - -n:按数值排序 - -r:倒序 - -k:指定排序字段 - -t:指定分隔符 - -u:去重 - 示例: - sort -n -k2 file(按第二列数值排序) - sort -t: -k3 -n /etc/passwd(按第三列数值排序) uniq(去重工具): - 基本用法:uniq [options] file - 常用选项: - -c:统计重复次数 - -d:只显示重复的行 - -u:只显示不重复的行 - 示例: - sort file | uniq -c(排序后统计重复次数) 组合使用: - 统计日志中错误数量:grep "error" log | wc -l - 查找访问量最高的 IP:awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 - 提取文件中的邮箱:grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file
服务端2月17日 23:36
Linux 系统安全加固措施有哪些,包括用户管理、SSH 配置和防火墙设置?Linux 系统安全是运维和开发人员必须掌握的重要知识,涉及用户管理、权限控制、防火墙配置等多个方面。 用户和组管理: - useradd:创建用户,如 useradd -m -s /bin/bash username(创建用户并设置家目录和 shell) - userdel:删除用户,如 userdel -r username(删除用户及其家目录) - usermod:修改用户属性,如 usermod -aG group username(将用户添加到组) - passwd:修改用户密码,如 passwd username - groupadd:创建组,如 groupadd groupname - groupdel:删除组,如 groupdel groupname - gpasswd:管理组,如 gpasswd -a username groupname(将用户添加到组) - id:查看用户 ID 和组信息 - whoami:查看当前用户 - w:查看当前登录用户 SSH 安全配置: - 配置文件:/etc/ssh/sshd_config - 禁用 root 登录:PermitRootLogin no - 禁用密码登录:PasswordAuthentication no(使用密钥认证) - 修改默认端口:Port 2222 - 限制登录用户:AllowUsers user1 user2 - 密钥认证:ssh-keygen 生成密钥对,将公钥复制到服务器的 ~/.ssh/authorized_keys - 使用 ssh-copy-id:ssh-copy-id user@host 防火墙配置: - iptables:传统防火墙工具 - 查看规则:iptables -L -n - 添加规则:iptables -A INPUT -p tcp --dport 22 -j ACCEPT - 删除规则:iptables -D INPUT 1 - 保存规则:iptables-save > /etc/iptables/rules.v4 - firewalld:动态防火墙管理 - 查看规则:firewall-cmd --list-all - 开放端口:firewall-cmd --add-port=80/tcp --permanent - 重载配置:firewall-cmd --reload - ufw:简化防火墙配置(Ubuntu) - 启用防火墙:ufw enable - 开放端口:ufw allow 22 - 查看状态:ufw status 文件权限和 SELinux: - chmod:修改文件权限 - chown:修改文件所有者 - chgrp:修改文件所属组 - SELinux:安全增强型 Linux - 查看状态:getenforce - 临时禁用:setenforce 0 - 永久禁用:修改 /etc/selinux/config - 查看上下文:ls -Z 系统加固: - 禁用不必要的服务:systemctl disable service - 更新系统:apt update && apt upgrade(Debian/Ubuntu)或 yum update(CentOS/RHEL) - 配置自动更新:unattended-upgrades(Debian/Ubuntu) - 安装安全工具:fail2ban(防止暴力破解)、rkhunter(检测 rootkit) - 配置日志审计:auditd - 限制 sudo 权限:编辑 /etc/sudoers,使用 visudo 命令 安全审计: - 查看登录日志:last、lastlog - 查看认证日志:/var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL) - 查看系统日志:/var/log/messages、journalctl - 查看进程:ps aux、top - 查看网络连接:ss -tulnp、netstat -tulnp - 查看开放端口:nmap localhost 应急响应: - 检查异常进程:ps aux | grep -v grep | grep -E "bash|sh|python|perl" - 检查异常网络连接:ss -tulnp | grep ESTABLISHED - 检查异常文件:find / -perm -4000 -o -perm -2000(查找 SUID/SGID 文件) - 检查用户登录:last、lastlog - 隔离受感染系统:断开网络连接 - 备份重要数据:在清理前备份关键数据
服务端2月17日 23:36
Linux 系统性能监控有哪些常用工具,如何分析 CPU、内存、磁盘和网络的使用情况?Linux 系统性能监控是运维工程师的重要技能,需要掌握多种工具来诊断系统瓶颈。 CPU 监控: - top/htop:实时查看 CPU 使用率、进程信息 - vmstat:报告虚拟内存统计信息,如 vmstat 1 5(每秒更新一次,共5次) - mpstat:显示各个 CPU 核心的使用情况,如 mpstat -P ALL 1 - sar:系统活动报告,如 sar -u 1 10(每秒采集一次,共10次) 内存监控: - free:显示内存使用情况,free -h 以人类可读格式显示 - vmstat:查看内存交换、缓存等信息 - ps aux:查看进程的内存占用(VSZ、RSS) - pmap:查看进程的内存映射 磁盘监控: - df:查看磁盘空间使用情况,df -h 以人类可读格式显示 - du:查看目录或文件的大小,du -sh directory - iostat:查看磁盘 I/O 统计信息,如 iostat -x 1 - iotop:实时查看磁盘 I/O 使用情况(需要 root 权限) 网络监控: - ifconfig/ip:查看网络接口配置 - netstat/ss:查看网络连接和端口监听,如 netstat -tulnp 或 ss -tulnp - nethogs:按进程查看网络带宽使用 - tcpdump:抓包分析网络流量,如 tcpdump -i eth0 port 80 日志分析: - /var/log/messages:系统主日志 - /var/log/syslog:系统日志(Debian/Ubuntu) - /var/log/dmesg:内核启动日志 - journalctl:systemd 日志查看工具,如 journalctl -f(实时查看) 综合监控工具: - dstat:集成了 vmstat、iostat、netstat 等功能 - glances:基于 Web 的系统监控工具 - prometheus + grafana:企业级监控解决方案 性能优化建议: - CPU:优化算法、减少不必要的计算、使用多进程/多线程 - 内存:减少内存泄漏、优化数据结构、使用缓存 - 磁盘:使用 SSD、优化文件系统、减少 I/O 操作 - 网络:使用 CDN、优化 TCP 参数、减少网络请求
服务端2月17日 23:35
Linux 系统服务管理中如何使用 systemctl 和 service 命令管理服务?Linux 系统服务管理是运维工程师的核心技能,主要涉及 systemd 和传统的 init 系统。 systemd 服务管理: - systemctl start service:启动服务 - systemctl stop service:停止服务 - systemctl restart service:重启服务 - systemctl reload service:重新加载配置(不中断服务) - systemctl status service:查看服务状态 - systemctl enable service:设置服务开机自启 - systemctl disable service:取消服务开机自启 - systemctl is-enabled service:检查服务是否开机自启 - systemctl list-units --type=service:列出所有服务 - systemctl list-unit-files --type=service:列出所有服务文件 - systemctl daemon-reload:重新加载 systemd 配置 服务配置文件: - 位置:/etc/systemd/system/ 或 /usr/lib/systemd/system/ - 示例:/etc/systemd/system/nginx.service 服务配置文件格式: ```ini [Unit] Description=nginx service After=network.target [Service] Type=forking ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target ``` 传统 init 服务管理(SysVinit): - service service start:启动服务 - service service stop:停止服务 - service service restart:重启服务 - service service status:查看服务状态 - chkconfig --list:列出所有服务 - chkconfig service on:设置服务开机自启 - chkconfig service off:取消服务开机自启 服务日志管理: - journalctl -u service:查看特定服务的日志 - journalctl -u service -f:实时查看服务日志 - journalctl -u service --since today:查看今天的日志 - journalctl -u service --since "2024-01-01" --until "2024-01-02":查看指定时间段的日志 - journalctl -p err:查看错误级别的日志 - /var/log/messages:系统主日志 - /var/log/syslog:系统日志(Debian/Ubuntu) 服务故障排查: - 检查服务状态:systemctl status service - 查看服务日志:journalctl -u service - 检查配置文件:cat /etc/systemd/system/service.service - 检查端口监听:ss -tulnp | grep service - 检查进程:ps aux | grep service - 手动启动测试:直接运行服务的可执行文件 服务优化: - 调整启动顺序:使用 After 和 Wants 指令 - 设置资源限制:使用 LimitCPU、LimitMEM 等指令 - 配置自动重启:Restart=on-failure、RestartSec=10s - 优化启动时间:使用 Type=simple 或 Type=notify
服务端2月17日 23:35
Linux 系统监控和告警的常用工具、配置方法和最佳实践有哪些?Linux 系统监控和告警是保障系统稳定运行的重要手段,需要掌握各种监控工具和告警机制。 系统监控工具: - CPU 监控: - top:实时查看 CPU 使用率和进程信息 - htop:交互式进程查看器,功能更强大 - mpstat:显示各个 CPU 核心的使用情况 - sar:系统活动报告,可记录历史数据 - vmstat:报告虚拟内存统计信息 - 内存监控: - free:显示内存使用情况 - vmstat:查看内存交换、缓存等信息 - ps aux:查看进程的内存占用 - pmap:查看进程的内存映射 - 磁盘监控: - df:查看磁盘空间使用情况 - du:查看目录或文件的大小 - iostat:查看磁盘 I/O 统计信息 - iotop:实时查看磁盘 I/O 使用情况 - 网络监控: - ifconfig/ip:查看网络接口配置 - netstat/ss:查看网络连接和端口监听 - nethogs:按进程查看网络带宽使用 - tcpdump:抓包分析网络流量 - iftop:实时显示网络带宽使用 - 进程监控: - ps:查看进程状态 - top/htop:实时监控进程 - pgrep:查找进程 ID - pidstat:监控进程资源使用 性能分析工具: - strace:跟踪系统调用和信号 - ltrace:跟踪库函数调用 - perf:性能分析工具 - sysdig:系统级监控和故障排查 - eBPF:扩展伯克利数据包过滤器 日志监控: - /var/log/messages:系统主日志 - /var/log/syslog:系统日志(Debian/Ubuntu) - /var/log/auth.log:认证日志 - /var/log/secure:安全日志(CentOS/RHEL) - journalctl:systemd 日志查看工具 - logrotate:日志轮转工具 监控告警系统: - Nagios:企业级监控系统 - Zabbix:分布式监控系统 - Prometheus:时序数据库和监控系统 - Grafana:数据可视化平台 - ELK Stack(Elasticsearch、Logstash、Kibana):日志分析和可视化 - Datadog:云监控平台 - New Relic:应用性能监控 Prometheus 监控: - 数据采集:使用 Exporter 采集指标 - 常用 Exporter: - node_exporter:系统指标 - mysqld_exporter:MySQL 指标 - nginx_exporter:Nginx 指标 - redis_exporter:Redis 指标 - 配置文件:/etc/prometheus/prometheus.yml - 告警规则:使用 PromQL 定义告警条件 - 告警管理:Alertmanager 处理告警通知 Grafana 可视化: - 数据源配置:支持 Prometheus、Elasticsearch 等 - 仪表板:创建自定义监控面板 - 告警:基于可视化图表设置告警 - 模板:使用变量创建动态仪表板 告警通知方式: - 邮件:SMTP 邮件通知 - 短信:短信网关 - 即时通讯:Slack、钉钉、企业微信 - 电话:语音通知 - Webhook:自定义 Web 回调 告警策略: - 告警级别:Critical、Warning、Info - 告警阈值:根据业务需求设置合理阈值 - 告警抑制:避免告警风暴 - 告警聚合:相关告警合并通知 - 告警升级:长时间未处理自动升级 自定义监控脚本: - 编写 Shell/Python 脚本采集指标 - 使用 cron 定时执行 - 输出格式:支持 Nagios、Prometheus 等格式 - 示例: ```bash #!/bin/bash # 检查磁盘使用率 DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//') if [ $DISK_USAGE -gt 80 ]; then echo "CRITICAL: Disk usage is ${DISK_USAGE}%" exit 2 fi echo "OK: Disk usage is ${DISK_USAGE}%" exit 0 ``` 监控最佳实践: - 全面监控:覆盖 CPU、内存、磁盘、网络等关键指标 - 合理采样:避免监控数据量过大 - 告警分级:区分紧急和一般告警 - 告警收敛:避免重复告警 - 定期维护:清理过期数据,更新监控规则 - 文档记录:维护监控配置文档 - 测试验证:定期测试告警机制 常见监控指标: - 系统指标:CPU 使用率、内存使用率、磁盘使用率、网络流量 - 应用指标:请求数、响应时间、错误率、并发数 - 业务指标:订单量、用户数、交易额 故障排查流程: 1. 确认告警信息 2. 查看系统监控数据 3. 检查相关服务状态 4. 分析日志文件 5. 定位问题根因 6. 实施修复措施 7. 验证修复效果 8. 总结经验教训
服务端2月17日 23:35
Linux 网络配置和管理中常用的命令有哪些,如何配置网络接口、DNS 和防火墙?Linux 网络配置和管理是系统管理员的核心技能之一。 网络配置文件: - /etc/network/interfaces(Debian/Ubuntu):网络接口配置文件 - /etc/sysconfig/network-scripts/ifcfg-*(CentOS/RHEL):网络接口配置文件 - /etc/resolv.conf:DNS 解析配置文件 - /etc/hosts:主机名到 IP 地址的映射 - /etc/hostname:主机名配置 网络配置命令: - ifconfig:配置和显示网络接口(已废弃,推荐使用 ip 命令) - ip:新一代网络配置工具,如 ip addr show(显示 IP 地址)、ip link show(显示网络接口)、ip route show(显示路由表) - route:显示和操作 IP 路由表,如 route -n(显示路由表)、route add default gw 192.168.1.1(添加默认网关) - netstat:网络统计工具,如 netstat -tulnp(显示 TCP/UDP 监听端口)、netstat -an(显示所有连接) - ss:netstat 的替代工具,性能更好,如 ss -tulnp - ping:测试网络连通性,如 ping -c 4 google.com - traceroute:跟踪数据包路由,如 traceroute google.com - nslookup/dig:DNS 查询工具,如 dig google.com - curl/wget:下载工具,curl -I http://example.com(查看响应头) - telnet:测试端口连通性,如 telnet host port - nc(netcat):网络工具,如 nc -zv host port(测试端口) 网络服务管理: - systemctl:管理网络服务,如 systemctl restart network(重启网络服务) - service:传统服务管理命令,如 service network restart 防火墙配置: - iptables:传统的防火墙工具,如 iptables -L(列出规则)、iptables -A INPUT -p tcp --dport 80 -j ACCEPT(添加规则) - firewalld:动态防火墙管理守护进程,如 firewall-cmd --list-all(查看规则)、firewall-cmd --add-port=80/tcp(开放端口) - ufw:简化防火墙配置工具(Ubuntu),如 ufw allow 80(开放端口) 网络故障排查: - 检查网络接口:ip addr show 或 ifconfig - 检查路由表:ip route show 或 route -n - 检查 DNS:cat /etc/resolv.conf、dig domain.com - 检查端口监听:ss -tulnp 或 netstat -tulnp - 检查网络连通性:ping、traceroute - 抓包分析:tcpdump -i eth0 port 80 - 查看网络统计:sar -n DEV 1 网络性能优化: - 调整 TCP 参数:修改 /etc/sysctl.conf,如 net.ipv4.tcp_tw_reuse=1 - 增加连接数:net.core.somaxconn、net.ipv4.tcp_max_syn_backlog - 优化网络缓冲区:net.core.rmem_max、net.core.wmem_max
服务端2月17日 23:34
Linux 进程管理中常用的命令有哪些,如何查看、终止和管理后台进程?Linux 进程管理是系统运维和开发的核心技能。每个进程都有唯一的进程 ID(PID),父进程 ID(PPID),以及运行状态。 常用进程管理命令: - ps:查看当前进程状态,常用选项包括 ps aux(显示所有进程)、ps -ef(完整格式显示)、ps -l(长格式显示) - top/htop:实时监控系统进程和资源使用情况,htop 提供更友好的交互界面 - kill:终止进程,如 kill PID(发送 SIGTERM 信号)、kill -9 PID(强制终止,发送 SIGKILL 信号) - killall:按进程名终止进程,如 killall nginx - pkill:按模式匹配终止进程,如 pkill -f "python script.py" - pgrep:查找进程 ID,如 pgrep nginx - nohup:让命令在后台持续运行,如 nohup command & - &:在后台运行命令,如 command & - jobs:查看当前 shell 的后台任务 - bg/fg:将任务切换到后台/前台运行 进程状态包括: - R(Running):正在运行或在运行队列中等待 - S(Sleeping):可中断睡眠 - D(Uninterruptible Sleep):不可中断睡眠 - T(Stopped):已停止 - Z(Zombie):僵尸进程 僵尸进程是已完成但父进程尚未读取其退出状态的进程,需要父进程调用 wait() 或 waitpid() 来回收。孤儿进程是父进程已终止但仍在运行的进程,会被 init 进程(PID 1)收养。 进程间通信(IPC)方式包括管道、消息队列、共享内存、信号量、套接字等。