ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

fish shell `ulimit` 内置命令完全指南:查看与设置进程资源限制

fish shell `ulimit` 内置命令完全指南:查看与设置进程资源限制 CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载ulimit是 fish 内置命令builtin用于读取或修改当前 shell 及其派生的所有子进程的资源使用限制resource usage limits涵盖核心文件大小、栈大小、CPU 时间、打开文件描述符数量、进程数等资源。本文以 doc_src/cmds/ulimit.rst 官方文档为骨架结合 src/builtins/ulimit.rs 的 Rust 实现与 tests/checks/ulimit.fish 测试用例完整讲解语法、全部资源选项、硬/软限制语义、单位换算、与 bash 的差异及底层实现原理帮助你精确掌控 shell 运行环境的资源边界。命令语法与基本行为ulimit [OPTIONS] [LIMIT]ulimit的行为由是否给出LIMIT参数决定省略LIMIT打印指定资源的当前限制值默认取软限制见下文-H/-S语义给出LIMIT将指定资源设置为新值并作用于 shell 自身及其后续派生的所有子进程。如果不指定任何资源选项默认假定为-f文件大小限制与 bash 行为一致。该默认值在 src/builtins/ulimit.rs 的Options::default()中定义what初始化为limits::FSIZE。退出状态为 0除非提供了无效选项或参数设置新限制时发生错误如权限不足。资源选择选项-b ~ -T详解使用以下开关之一指定要设置或查询的资源。下表按源码 RESOURCE_ARR 定义 与文档整理同时给出底层对应的 POSIXsetrlimit资源常量与显示/输入时使用的单位短选项长选项资源含义对应RLIMIT_*常量单位-b--socket-bufferssocket 缓冲区最大大小RLIMIT_SBSIZEFreeBSD/NetBSD/DragonFlykB-c--core-size可创建的核心文件core file最大大小RLIMIT_COREkB-d--data-size进程数据段最大大小RLIMIT_DATAkB-e--nice最大 nice 值控制Linux 上以 20 减去该值得到有效值RLIMIT_NICELinux无缩放-f--file-size进程创建的文件最大大小RLIMIT_FSIZEkB-i--pending-signals可排队的最大信号数RLIMIT_SIGPENDINGLinux无缩放-l--lock-size可锁定到内存的最大大小RLIMIT_MEMLOCKkB-m--resident-set-size最大常驻内存集RSS大小RLIMIT_RSSkB-n--file-descriptor-count打开文件描述符的最大数量RLIMIT_NOFILE无缩放-q--queue-sizePOSIX 消息队列中数据的最大大小RLIMIT_MSGQUEUELinuxkB-r--realtime-priority最大实时调度优先级RLIMIT_RTPRIOLinux无缩放-s--stack-size最大栈大小RLIMIT_STACKkB-t--cpu-timeCPU 时间上限秒RLIMIT_CPU秒-u--process-count当前用户可用的最大进程数RLIMIT_NPROC无缩放-w--swap-size当前用户可用的最大交换空间RLIMIT_SWAPFreeBSDkB-v--virtual-memory-sizeshell 可用的最大虚拟内存RLIMIT_ASkB-y--realtime-maxtime最大连续实时 CPU 时间微秒RLIMIT_RTTIMELinux无缩放-K--kernel-queues当前用户最大 kqueue 数量RLIMIT_KQUEUESFreeBSD无缩放-P--ptys当前用户最大伪终端数量RLIMIT_NPTSFreeBSD无缩放-T--threads当前用户最大并发线程数RLIMIT_NTHRNetBSD无缩放平台可用性提醒并非所有限制在所有操作系统上都存在。源码 limits 模块 使用define_on!宏按目标平台条件编译Linux 专属的包括RLIMIT_SIGPENDING、RLIMIT_MSGQUEUE、RLIMIT_RTPRIO、RLIMIT_RTTIME、RLIMIT_NICEFreeBSD 系含 NetBSD/DragonFly提供RLIMIT_SBSIZE其中RLIMIT_KQUEUES、RLIMIT_SWAP、RLIMIT_NPTS为 FreeBSD 专属RLIMIT_NTHR为 NetBSD 专属Cygwin 与 illumos 上RLIMIT_MEMLOCK、RLIMIT_NPROC被定义为-1不可用。具体以你所用操作系统的setrlimit手册为准。在 src/builtins/ulimit.rs 中所有长短选项均通过WGetopter解析完整支持上述 GNU 风格长选项并且ulimit -h或--help会调用builtin_print_help输出帮助。fish 还自带了 share/completions/ulimit.fish 补全脚本为全部选项提供参数补全。单位换算的源码依据源码 Resource 结构体 为每个资源定义了multiplier隐式乘法因子绝大多数内存/文件类资源-b -c -d -f -l -m -q -s -v -w的 multiplier 为1024kB-tCPU 时间秒、-n文件描述符数、-u进程数以及-e -i -r -y -K -P -T的 multiplier 为1无缩放。读取时 print 函数 将原始字节数除以 multiplier 后输出写入时 ulimit 主函数 将用户输入值乘以 multiplier 后再调用setrlimit。因此文档中的单位规则完全由代码落地内存、文件、队列类资源单位为千字节kB-t单位为秒-n、-u为无缩放数值。LIMIT 参数数字与特殊值LIMIT可以是以下任一形式数字按资源指定的单位给出新值整数hard取当前硬限制值soft取当前软限制值unlimited表示无限制底层映射为RLIM_INFINITY。特殊值的解析在源码 ulimit 主函数 中实现且通过wcscasecmp进行大小写不敏感比较——因此ULIMIT、Unlimited等写法同样有效。数字解析使用fish_wcstol解析失败或乘法溢出时会输出Invalid limit %s并返回失败状态。例如禁用核心转储core dumpulimit -c 0将核心文件大小限制设为 0 后进程崩溃时不再产生 core 文件。测试用例 tests/checks/ulimit.fish 验证了这一流程ulimit --core-size 0后再查询输出为0。硬限制与软限制-H / -Sulimit还支持两个决定设置“哪种限制”的选项选项含义-H或--hard设置硬限制hard limit-S或--soft设置软限制soft limit关键语义文档原文继承并被源码验证硬限制只能降低一旦设定就不能再提高只有超级用户有权提高硬限制软限制可以在硬限制范围内上调若同时不指定-H与-S则设置新值时软、硬限制同时更新查询当前值时默认报告软限制。源码 set_limit 函数 具体实现了这一语义当仅设置软限制时若新值超过当前硬限制或为unlimited而硬限制有限软限制会被钳制到硬限制值避免软限制高于硬限制。设置失败且errno为EPERM时输出Permission denied when changing resource of type 资源描述——测试用例 tests/checks/ulimit.fish 专门验证了普通用户尝试提高硬限制会得到该错误。其他选项选项含义-a或--all打印当前所有资源限制-h或--help显示本命令帮助-a输出由 print_all 函数 生成遍历全部可用资源对齐列宽输出形如最大资源描述 (单位-开关) 数值的行值为RLIM_INFINITY时显示unlimited。输出会同时标注每个资源的单位(seconds, ...)、(kB, ...)或(...)并给出对应短开关字符便于对照。-a可与-H或-S组合只打印硬限制或软限制集合ulimit -a # 打印所有软限制 ulimit -a -H # 打印所有硬限制与 bashulimit的差异fish 文档明确承诺fish 的ulimit行为应与 bash 基本一致但存在以下刻意差异fish 为所有开关提供 GNU 风格长选项如--stack-sizebash 多数短选项不支持等价的--长写法fish 不支持-p查询 pipe 大小。bash 的实现是一个编译期检查通过向管道写入数据并等待 SIGPIPE 来经验性地猜测该数值fish 认为这种方式测得的管道大小不可靠因此刻意不实现fish 不支持在一次命令中设置或读取多个限制唯一的例外是使用-a一次性报告全部限制。相应地传入多个参数时会报错——源码中arg_count ! 1时输出too many arguments测试用例 tests/checks/ulimit.fish 亦覆盖了该路径。此外bash 某些版本可能还支持更多额外的限制选项这些选项在 fish 中不存在。若请求的资源在当前操作系统上不可用底层常量为-1哨兵值fish 会输出Resource limit not available on this operating system并返回失败状态相关分支见 ulimit 主函数测试见 tests/checks/ulimit.fish。实战示例以下示例均在 fish 交互 shell 中可直接执行# 查看当前打开文件描述符限制软限制无缩放单位 ulimit -n # 查看当前栈大小限制kB ulimit -s # 将栈大小软限制提高到 8192 kB8 MB ulimit -s 8192 # 设置硬栈大小限制为 64 kB ulimit -Hs 64 # 禁用核心转储 ulimit -c 0 # 查看当前用户可用最大进程数 ulimit -u # 将 CPU 时间上限设为 30 秒 ulimit -t 30 # 查看所有资源限制含单位与对应开关标注 ulimit -a # 使用特殊值将文件大小限制设为无限制默认资源为 -f ulimit unlimited # 将文件大小软限制设为当前硬限制 ulimit soft文档给出的经典示例ulimit -Hs 64即把硬栈大小限制设为 64 kB。由于硬限制只能下调、不能上调-H常用于为子进程设定安全的内存/栈边界。实现架构一览从源码结构看fish 的ulimit实现遵循“资源常量定义 → 选项解析 → 查询/设置 → 输出”的清晰分层平台抽象层limits 模块 将各操作系统的RLIMIT_*常量统一为整数 ID不支持的平台编译为-1资源元数据表RESOURCE_ARR 集中登记每个资源的 ID、描述文本、命令行开关与单位 multiplier-a输出、单位换算均由此驱动系统调用封装getrlimit/setrlimit 函数 基于 nix crate 调用getrlimit(2)/setrlimit(2)命令入口ulimit 函数 完成选项解析、特殊值处理与最终调用并作为 builtin 注册进 src/builtins/shared/misc.rs 的BuiltinData表中其 help 分类描述为 Get/set resource usage limits见 misc.rs。值得说明的是fish 的ulimit与系统层setrlimit直接对接因此设置后影响的是当前 fish 进程及其后续子进程——重启 shell 或登录会话后设置即失效如需持久化可写入config.fish或 shell 启动脚本中。这与 Linux 下limits.conf等系统级配置的作用域不同使用时请注意区分。赞分享CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载相关推荐系统资源限制查看awesome-shell中的ulimit配置工具系统资源限制查看awesome shell中的ulimit配置工具 你是否曾经遇到过服务器进程突然崩溃却找不到明确错误日志的情况或者在运行程序时频繁收到文档教程Puma系统资源限制ulimit配置与进程约束Puma系统资源限制ulimit配置与进程约束 你是否曾遇到过Puma服务器在高并发场景下突然崩溃日志中出现too many open files错误后端网络fish-shell 内置命令 false 完全指南退出状态、源码实现与实战用法fish shell 内置命令 false 完全指南退出状态、源码实现与实战用法 false 是 fish shell 中最精简的内置命令之一它的全部职责就CLI开发工具上一篇Zotero PDF2zh翻译服务详解如何选择最适合的LLM API下一篇FRESCO多模型支持实战如何集成自定义SD模型和ControlNet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表