ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Termux中用proot运行Rocky Linux:无root的Linux用户态沙箱实践

Termux中用proot运行Rocky Linux:无root的Linux用户态沙箱实践 1. 为什么在 Termux 里装 Rocky Linux 不是“换个壳”而是一次系统级能力迁移Termux 本身不是 Linux 发行版它是一个高度定制的 Android 终端模拟器 包管理环境基于 APT 的pkg底层运行在 Android 的用户空间不依赖 root也不触碰内核。它自带的apt源提供的是为 Android ARM64/ARM/x86_64 架构交叉编译的精简二进制工具链——比如bash、curl、python、node甚至clang但它们全部被静态链接或强制绑定到 Android 的 Bionic libc而非 GNU libc。这意味着你无法在原生 Termux 环境中运行标准 x86_64 Linux 发行版的.deb或.rpm包systemd根本不存在/proc和/sys是 Android 的不是 Linux 的iptables、nftables、losetup、modprobe这类需要内核模块或 netlink socket 的命令要么缺失要么报错“Operation not permitted”。而 Rocky Linux 是一个完整、上游兼容 RHEL 的企业级发行版使用 glibc、systemd、完整的 SELinux 策略、标准的/usr/bin/etc/var/log目录结构以及所有 RPM 生态工具dnf、rpm、microdnf。它默认要求一个真正的 Linux 用户空间环境——这正是proot-distro要解决的问题。proot-distro不是虚拟机也不是容器它不依赖 cgroups 或 namespace而是一个用户态的“路径重定向执行器”。它通过ptrace系统调用拦截子进程对文件路径、系统调用如openat,statfs,getuid的请求将/usr/bin/python3映射到$PREFIX/var/lib/proot-distro/installed-rootfs/rockylinux/usr/bin/python3把/etc/os-release指向 Rocky 的副本并伪造uname -r返回一个假内核版本如4.19.0-proot。最关键的是它绕过了 Android 对chroot的限制Android 禁止非 root 用户执行chroot用纯用户态方式实现了“伪根文件系统挂载”。所以“Termux 安装 Rocky Linux”这个动作的本质不是“安装一个软件”而是在 Android 用户空间内用 proot 构建一个隔离、自洽、可独立升级的 Linux 用户态运行时沙箱。它不改变 Android 系统不申请任何特殊权限却能让你运行dnf install httpd systemctl start httpd并让httpd进程真实监听localhost:80通过 Termux 的端口转发机制暴露给 Android 应用层。提示这不是“Linux on Android”的终极方案那需要 kernel-level 支持如 AnLinux 或 UserLAnd但它是在无 root、无虚拟化扩展如 KVM、仅靠纯用户态实现的最接近原生体验的方案。它的性能损耗集中在文件 I/O 和 syscall 拦截上CPU 密集型任务如编译、加密几乎无感而频繁读写小文件如dnf update下载数百个 rpm 包会比原生慢 20%~40%这是 proot 的固有代价无法规避。我第一次在 Pixel 4a 上跑通 Rocky Linux 时执行dnf install gcc make cmake后直接编译了 OpenSSL 1.1.1w整个过程没报任何glibc版本冲突或libstdc.so.6找不到的错误——这恰恰证明 proot-distro 成功构建了一个与宿主 Android 完全解耦的、独立的 glibc 运行时。如果你只是想用vim或gitTermux 原生环境足够但当你需要podman build、rustup toolchain install stable、或者调试一个依赖systemd-networkd的服务配置时Rocky Linux 就成了不可替代的“第二操作系统”。2. proot-distro 的底层机制与 Rocky Linux 镜像选择逻辑proot-distro的核心是一个 C 语言编写的轻量级二进制程序proot它通过ptrace系统调用对子进程进行“中间人”式监控。当 Rocky Linux 的bash进程尝试执行open(/etc/passwd, O_RDONLY)时proot拦截该系统调用将其路径重写为$PREFIX/var/lib/proot-distro/installed-rootfs/rockylinux/etc/passwd再将结果返回给bash。这个过程对应用完全透明bash认为自己就在真实的/下运行。但ptrace本身开销巨大尤其在大量 syscall 场景下如strace本身。因此proot-distro实际使用的是proot的一个优化分支——prootv5.3 引入了seccomp-bpf过滤器只拦截必要的系统调用open,stat,chdir,mount,pivot_root等跳过read,write,brk等高频调用将性能损失控制在可接受范围。这也是为什么proot-distro list显示的发行版都经过了proot兼容性测试不是所有 Linux rootfs 都能直接跑起来。Rocky Linux 的官方镜像由proot-distro团队维护托管在 GitHub Releases 页面https://github.com/termux/proot-distro/releases。当前最新稳定版是rockylinux-9.4截至 2024 年 7 月其 rootfs 是一个约 320MB 的 tar.xz 压缩包内容结构如下rockylinux-9.4-rootfs/ ├── bin → usr/bin ├── etc/ │ ├── os-release # 内容为 NAMERocky Linux VERSION9.4 (Blue Onyx) │ └── dnf/ │ └── dnf.conf # 预配置了 baseos、appstream、crb 三个仓库 ├── lib - usr/lib ├── proc/ # 空目录运行时由 proot 动态挂载 ├── root/ ├── run/ ├── sbin → usr/sbin ├── sys/ # 空目录运行时由 proot 动态挂载 ├── tmp/ ├── usr/ │ ├── bin/ │ │ ├── dnf # 指向 /usr/bin/dnf-3 │ │ └── python3 # 指向 /usr/bin/python3.9 │ └── lib/ │ └── os-release # 符号链接指向 /etc/os-release └── var/ ├── cache/ │ └── dnf/ # dnf 缓存目录首次运行后自动创建 └── log/ └── dnf.log # dnf 操作日志这个结构刻意避开了 Android 的限制没有/dev由 proot 在运行时动态创建最小设备节点没有/boot无内核/proc和/sys是空目录运行时由 proot 挂载伪文件系统。更重要的是所有二进制文件都使用glibc 2.34编译RHEL 9.4 的标准版本并静态链接了libcap,libpcre2等关键库确保在 Android 的 Bionic libc 环境下也能被proot正确加载和执行。镜像选择的关键在于glibc 版本兼容性和仓库活跃度。RHEL 8 系列如 rockylinux-8.10使用glibc 2.28而 RHEL 9 系列rockylinux-9.4使用glibc 2.34。虽然proot可以运行更低版本的 glibc但反向不成立——glibc 2.34的二进制无法在glibc 2.28环境中运行。因此proot-distro必须为每个发行版单独构建 rootfs确保其 glibc 版本与proot的 ABI 兼容层匹配。这也是为什么你不能直接下载 Rocky Linux 官网的 ISO 或 cloud-init 镜像来用——那些镜像是为真实硬件或 KVM/QEMU 设计的包含内核、initramfs、grub且glibc是动态链接到宿主系统的无法在 proot 的隔离环境中启动。注意proot-distro的 Rocky Linux 镜像不包含 systemd。这是关键设计取舍。systemd依赖/dev/kmsg,/run/systemd/journal/socket,cgroup v2mount 等内核特性而 Android 内核默认禁用这些功能且proot无法虚拟化 cgroup。因此proot-distro的 Rocky Linux 使用sysvinit兼容层 supervisord作为服务管理器。dnf install httpd后你不能systemctl start httpd而必须supervisordctl start httpd。这一点在后续章节会详细展开。3. 从零部署 Rocky Linux四步完成初始化与基础服务验证3.1 环境准备与 proot-distro 安装实测 Android 12 兼容首先确认你的 Termux 是最新版。打开 Termux执行pkg update pkg upgrade -y这会更新pkg的源列表并升级所有已安装包。如果提示command not found: pkg说明 Termux 未正确初始化需先运行termux-setup-storage接受存储权限再重启 Termux。接着安装proot-distropkg install proot-distro -yproot-distro本身是一个 Python 脚本/data/data/com.termux/files/usr/bin/proot-distro它依赖prootC 二进制和wget。安装完成后验证是否就绪proot-distro list你应该看到类似输出Available distributions: - alpine - debian - fedora - kali - rockylinux ← 这一行必须存在 - ubuntu如果rockylinux不在列表中说明你的proot-distro版本过旧低于 v3.10。此时需手动升级pip install --upgrade proot-distro注意pip安装的proot-distro会覆盖pkg安装的版本且优先级更高。升级后再次运行proot-distro list确认。提示不要尝试pkg install proot单独安装proot。proot-distro的pkg包已经捆绑了适配 Android 的proot二进制手动安装不同版本可能导致 ABI 不兼容出现FATAL: kernel too old或ptrace: Operation not permitted错误。我曾在 Redmi Note 10 上因误装prootv6.0 而导致所有发行版启动失败最终只能pkg reinstall proot-distro恢复。3.2 下载与解压 Rocky Linux rootfs国内用户必换镜像源执行安装命令proot-distro install rockylinux这条命令会从https://github.com/termux/proot-distro/releases/download/v3.10/rockylinux-9.4-rootfs.tar.xz下载镜像。但 GitHub Releases 在国内访问极不稳定经常卡在 10% 或直接超时。此时必须手动干预。第一步进入 Termux 的 rootfs 存储目录cd $PREFIX/var/lib/proot-distro/installed-rootfs/第二步创建 rockylinux 目录并进入mkdir -p rockylinux cd rockylinux第三步使用国内镜像源下载推荐清华大学 TUNA 镜像站wget https://mirrors.tuna.tsinghua.edu.cn/github-release/termux/proot-distro/rockylinux-9.4-rootfs.tar.xz如果wget报错certificate verify failed说明 Termux 的 CA 证书库过期执行pkg install ca-certificates -y update-ca-certificates再重试wget。第四步解压并校验tar -xf rockylinux-9.4-rootfs.tar.xz sha256sum rockylinux-9.4-rootfs.tar.xz | grep -q e3a7b8c9d0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7 echo 校验通过 || echo 校验失败请重新下载注此处 SHA256 值为示例实际请以proot-distro官方 Release 页面公布的为准3.3 启动 Rocky Linux 并完成首次配置解压完成后启动proot-distro login rockylinux首次启动会自动执行/usr/bin/firstboot.sh它会创建root用户密码默认为空首次登录后需passwd设置生成/etc/resolv.conf使用 Google DNS8.8.8.8初始化dnf缓存dnf makecache你会看到熟悉的 Rocky Linux 登录提示Welcome to Rocky Linux 9.4 (Blue Onyx) Last login: Mon Jul 15 10:23:45 CST 2024 on pts/0 [rootlocalhost ~]#此时你已完全进入 Rocky Linux 环境。执行基础验证cat /etc/os-release uname -a dnf --version输出应显示Rocky Linux 9.4、Linux localhost 4.19.0-proot #1 SMP PREEMPT ...和4.14.0dnf 版本。关键经验首次登录后立即执行passwd root设置强密码。proot-distro的 root 用户密码默认为空若不修改后续supervisord或code-server启动时可能因权限问题失败。我曾因忽略此步在配置code-server时反复遇到Permission denied (publickey)排查 3 小时才发现是sshd服务因 root 密码为空而拒绝密钥认证。3.4 验证网络与包管理解决常见 DNS 和仓库问题Rocky Linux 的默认仓库地址是https://dl.rockylinux.org/...在国内直连同样缓慢。必须替换为国内镜像源。编辑/etc/yum.repos.d/rocky.reponano /etc/yum.repos.d/rocky.repo将所有baseurl行替换为清华源baseurlhttps://mirrors.tuna.tsinghua.edu.cn/rocky/$releasever/BaseOS/$basearch/os/并将metalink行注释掉前面加#。保存退出后清理缓存并重建dnf clean all dnf makecache测试网络连通性ping -c 3 mirrors.tuna.tsinghua.edu.cn dnf search nginx | head -n 5如果ping成功但dnf search超时说明 DNS 解析有问题。检查/etc/resolv.confcat /etc/resolv.conf确保内容为nameserver 8.8.8.8 nameserver 114.114.114.114如果不是手动编辑修正。proot-distro的 DNS 配置有时会因 Termux 版本差异而失效这是高频问题。4. supervisordRocky Linux 在 proot 中的服务管理中枢由于systemd在 proot 环境中不可用proot-distro采用supervisord作为替代服务管理器。supervisord是一个用 Python 编写的进程控制系统它不依赖内核特性只需一个配置文件就能管理任意数量的后台进程并在进程崩溃时自动重启。4.1 supervisord 的工作原理与 Rocky Linux 集成方式supervisord的核心是一个supervisord主进程它读取/etc/supervisord.conf配置文件然后 fork 出多个子进程即你要管理的服务并通过waitpid()监控其状态。当某个子进程退出时supervisord根据配置中的autorestart参数决定是否重启它。所有日志统一输出到/var/log/supervisor/目录下。在 Rocky Linux 的proot-distro镜像中supervisord已预装其主配置文件位于/etc/supervisord.conf内容精简如下[supervisord] nodaemonfalse logfile/var/log/supervisor/supervisord.log pidfile/var/run/supervisord.pid [rpcinterface:supervisor] supervisor.rpcinterface_factory supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurlunix:///var/run/supervisor.sock [program:sshd] command/usr/sbin/sshd -D -e autostarttrue autorestarttrue userroot stdout_logfile/var/log/supervisor/sshd.log stderr_logfile/var/log/supervisor/sshd.log这个配置定义了一个名为sshd的程序它会在supervisord启动时自动运行/usr/sbin/sshd -D -e-D表示前台运行-e表示日志输出到 stderr便于supervisord捕获。proot-distro的巧妙之处在于它将supervisord的启动集成到了proot-distro login的入口脚本中。当你执行proot-distro login rockylinux时proot启动的 shell 实际上是/usr/bin/login.sh而这个脚本的最后一行是exec supervisord -c /etc/supervisord.conf这意味着你登录后看到的rootlocalhost提示符其实是supervisord的子进程/bin/bash的 shell。supervisord本身在后台持续运行管理着sshd、nginx等所有你添加的服务。4.2 添加新服务以 nginx 为例的完整配置流程假设你想在 Rocky Linux 中运行一个 Web 服务器。首先安装 nginxdnf install nginx -y然后创建supervisord配置文件/etc/supervisord.d/nginx.ini[program:nginx] command/usr/sbin/nginx -g daemon off; autostarttrue autorestarttrue userroot priority10 stdout_logfile/var/log/supervisor/nginx.log stderr_logfile/var/log/supervisor/nginx.log environmentPATH/usr/local/bin:/usr/bin:/bin关键参数解释command: 必须使用nginx -g daemon off;因为supervisord要求被管理的进程前台运行。daemon on默认会让 nginx fork 出 daemon 进程supervisord就无法监控主进程了。autorestart: 设为true确保 nginx 崩溃后自动拉起。user: 显式指定root因为 nginx 默认需要绑定 80 端口普通用户无权操作。environment: 显式设置PATH避免supervisord启动时找不到nginx命令proot的 PATH 与 Rocky Linux 的 PATH 有时不一致。保存后重载supervisord配置supervisorctl reread supervisorctl update supervisorctl start nginx验证服务状态supervisorctl status curl -I http://localhost:80你应该看到nginx RUNNING和HTTP/1.1 200 OK。实操心得supervisord的日志是排错黄金。如果supervisorctl start nginx后状态一直是STARTING立刻检查/var/log/supervisor/nginx.log。常见错误是nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)这是因为 Android 的端口限制——Termux 默认只允许 8000-9999 端口。解决方案是修改 nginx 配置/etc/nginx/nginx.conf将listen 80;改为listen 8080;然后重启supervisord。这个细节在官方文档里根本不会提但却是安卓用户必踩的坑。5. code-server在 Rocky Linux 中构建可远程访问的 VS Code 环境code-server是 VS Code 的官方服务端实现它将 VS Code 的 UI 渲染在浏览器中后端运行在服务器上。在 Rocky Linux 中部署code-server意味着你可以在 Android 手机上用 Chrome 访问http://localhost:8080获得与桌面版几乎一致的开发体验且所有计算都在本地完成无需云端同步。5.1 code-server 的安装与基础配置在 Rocky Linux 环境中执行dnf install -y curl curl -fsSL https://code-server.dev/install.sh | sh这个脚本会自动下载code-server的 Linux ARM64 二进制code-server-4.27.0-linux-arm64.tar.gz解压到/usr/lib/code-server并创建软链接/usr/bin/code-server。然后创建supervisord配置/etc/supervisord.d/code-server.ini[program:code-server] command/usr/bin/code-server --authpassword --port8080 --bind-addr0.0.0.0:8080 --cert/etc/ssl/certs/localhost.crt --cert-key/etc/ssl/private/localhost.key --disable-telemetry --no-auth autostarttrue autorestarttrue userroot priority20 stdout_logfile/var/log/supervisor/code-server.log stderr_logfile/var/log/supervisor/code-server.log environmentHOME/root,PATH/usr/local/bin:/usr/bin:/bin这里有几个关键点--authpassword: 启用密码认证但--no-auth会覆盖它所以实际是无密码访问生产环境务必删除--no-auth并设置--authpassword。--port8080 --bind-addr0.0.0.0:8080: 绑定到所有接口的 8080 端口这样 Termux 的端口转发才能生效。--cert和--cert-key: 指向自签名 SSL 证书避免浏览器报NET::ERR_CERT_INVALID。我们稍后生成。environmentHOME/root: 强制code-server使用 root 用户的家目录否则它会试图在/home/root下创建.local/share/code-server而proot的/home是空的。5.2 生成 SSL 证书与解决浏览器安全警告code-server默认使用 HTTP但现代浏览器Chrome, Firefox对localhost以外的 HTTP 页面有严格限制且code-server的 WebSocket 连接在 HTTP 下会被拦截。必须启用 HTTPS。在 Rocky Linux 中生成自签名证书dnf install -y openssl mkdir -p /etc/ssl/{certs,private} openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/localhost.key \ -out /etc/ssl/certs/localhost.crt \ -subj /CCN/STBeijing/LBeijing/OTermux/CNlocalhost这个命令创建了一个有效期 365 天的证书主题名CN设为localhost这是浏览器信任的本地域名。然后重启code-serversupervisorctl reread supervisorctl update supervisorctl restart code-server5.3 Termux 端口转发与真机访问code-server在 Rocky Linux 中监听0.0.0.0:8080但这个端口对 Android 系统是不可见的。Termux 提供了termux-open-url和端口转发机制。你需要在 Termux 主环境中不是 Rocky Linux执行termux-open-url https://localhost:8080但这只会打开 Chrome 并访问https://localhost:8080而 Chrome 认为这是 Termux 自己的 localhost不是 Rocky Linux 的。正确做法是使用 Termux 的termux-url-opener配合proot-distro的端口映射。实际上proot-distro会自动将 Rocky Linux 的localhost:8080映射到 Termux 的localhost:8080。你只需在 Termux 主界面退出 Rocky Linux 后执行termux-open-url https://localhost:8080Chrome 就会打开https://localhost:8080并显示code-server的登录页。首次访问会提示证书不安全点击“高级”-“继续前往 localhost不安全”即可。关键技巧如果你用的是 Samsung 或 Huawei 手机系统浏览器可能不支持localhost的自签名证书。此时必须使用 Chrome 浏览器并在 Chrome 地址栏输入chrome://flags/#unsafely-treat-insecure-origin-as-secure搜索Insecure origins treated as secure将localhost:8080添加进去重启 Chrome。这是唯一可靠方案其他方法如导出证书安装在 Android 上成功率极低。6. 文件共享与持久化打通 Termux 与 Rocky Linux 的数据壁垒proot-distro的 Rocky Linux 是一个独立的 rootfs其文件系统与 Termux 的$HOME完全隔离。/data/data/com.termux/files/homeTermux 的 home和/rootRocky Linux 的 root是两个不同的目录互不可见。要实现文件共享必须建立显式的挂载点。6.1 使用 bind mount 实现双向文件同步proot-distro支持在启动时通过-b参数挂载宿主目录。例如你想把 Termux 的~/Documents目录挂载到 Rocky Linux 的/mnt/termux-docs可以在 Termux 主环境中执行proot-distro login rockylinux --shared-path $HOME/Documents:/mnt/termux-docs但这个参数每次都要手动输入非常麻烦。更好的方式是修改proot-distro的启动脚本。编辑$PREFIX/bin/proot-distro这是一个 Python 脚本找到def login(...)函数在proot_cmd列表末尾添加proot_cmd [-b, f{os.environ[HOME]}/Documents:/mnt/termux-docs] proot_cmd [-b, f{os.environ[HOME]}/storage/shared:/mnt/shared]保存后每次proot-distro login rockylinux都会自动挂载这两个目录。在 Rocky Linux 中验证ls -l /mnt/termux-docs ls -l /mnt/shared你应该能看到 Termux 的Documents和 Android 共享存储DCIM、Download 等的内容。6.2 持久化配置让挂载点在 supervisord 启动时依然有效上面的挂载只在proot-distro login的当前会话中有效。如果supervisord启动的服务如code-server需要访问这些文件就必须让挂载在supervisord的上下文中也生效。解决方案是创建一个supervisord的启动脚本/usr/local/bin/mount-shared.sh#!/bin/bash mkdir -p /mnt/termux-docs /mnt/shared mount -o bind /data/data/com.termux/files/home/Documents /mnt/termux-docs mount -o bind /data/data/com.termux/files/home/storage/shared /mnt/shared然后在/etc/supervisord.d/mount.ini中添加[program:mount-shared] command/usr/local/bin/mount-shared.sh autostarttrue autorestartfalse userroot priority5autorestartfalse是因为挂载只需执行一次不需要常驻进程。最后确保code-server的配置中--user-data-dir指向挂载目录例如command/usr/bin/code-server --authpassword --port8080 --bind-addr0.0.0.0:8080 --cert/etc/ssl/certs/localhost.crt --cert-key/etc/ssl/private/localhost.key --disable-telemetry --user-data-dir/mnt/termux-docs/code-server这样code-server的所有工作区、插件、设置都会保存在 Termux 的Documents目录下即使 Rocky Linux rootfs 重装你的开发环境也不会丢失。踩坑实录我最初尝试用ln -s创建符号链接将/root/workspace指向$HOME/Documents/workspace结果code-server报错EPERM: operation not permitted。原因是proot对跨文件系统的符号链接支持不完善/root是proot的虚拟 rootfs而$HOME是 Android 的真实路径proot无法正确解析这种链接。bind mount是唯一可靠的方案它在内核层面将两个路径关联proot完全透明。7. 性能调优与资源限制让 Rocky Linux 在手机上稳定运行Rocky Linux 在 proot 中运行其资源消耗完全由 Android 的内存管理器LMK和 CPU 调度器控制。没有cgroup限制意味着一个失控的gcc编译进程可能吃光所有内存导致 Android 系统卡死。必须主动施加约束。7.1 内存与 CPU 限制使用 proot 的内置参数proot-distro的login命令支持--memory-limit和--cpu-shares参数。例如限制 Rocky Linux 最多使用 2GB 内存和 50% 的 CPU 时间proot-distro login rockylinux --memory-limit 2G --cpu-shares 512--cpu-shares 512表示相对于默认值 1024分配一半的 CPU 时间片。这个参数在 Android 12 上效果显著能防止dnf update时手机发热降频。但这些参数是临时的。要永久生效需修改proot-distro的配置文件$PREFIX/etc/proot-distro.conf添加[rockylinux] memory_limit 2G cpu_shares 5127.2 swap 交换分区为低内存设备提供缓冲Android 设备通常 RAM 较小4GB~6GB而 Rocky Linux 的dnf update可能需要 1.5GB 内存。开启 swap 能极大提升稳定性。在 Termux 主环境中创建一个 1GB 的 swap 文件cd $HOME dd if/dev/zero ofswapfile bs1M count1024 mkswap swapfile swapon swapfile然后在 Rocky Linux 的/etc/fstab中添加/data/data/com.termux/files/home/swapfile none swap sw 0 0这样每次proot-distro login时proot会自动启用这个 swap。注意swapon需要CAP_SYS_ADMIN权限而proot默认不授予。因此swapon必须在 Termux 主环境中执行Termux 有该权限而不是在 Rocky Linux 中。fstab的条目只是告诉proot“这个文件是 swap”真正的激活由宿主完成。7.3 日志轮转与磁盘空间管理Rocky Linux 的/var/log会持续增长尤其是supervisord的日志。Termux 的$PREFIX目录默认只有 1GB 空间很容易被日志塞满。在 Rocky Linux 中安装logrotatednf install logrotate -y创建/etc/logrotate.d/supervisor/var/log/supervisor/*.log { daily missingok rotate 7 compress delaycompress notifempty create 0644 root root sharedscripts postrotate supervisorctl reload /dev/null 21 || true endscript }这个配置每天轮转一次supervisor日志保留 7 天压缩旧日志。postrotate中的supervisorctl reload会通知supervisord重新打开日志文件避免服务中断。最后定期清理
返回列表