为什么在脚本内部调用 ulimit -n 时不起作用?

为什么在脚本内部调用 ulimit -n 时不起作用?

这很奇怪。我试图通过我的ulimit设置为:60000startup.sh

#!/bin/bash

ulimit -n 60000
echo "Hello! File Descriptor set"

我可以使用./startup.sh(755 文件权限) 执行此操作,并打印 echo 行,并且不显示任何错误。但是,当我执行ulimit -n此操作时,它仍然显示1024,发生了什么?

让我感到惊奇的是,我可以ulimit -n 60000在终端中输入,然后执行ulimit -n,并且它完美地工作。为什么我不能通过脚本设置文件描述符限制?

Debian 8,64 位。OpenVZ 容器

答案1

ulimits 是每个进程,不是针对每个用户,也不是针对每个系统。

ulimit命令内置于 shell 中,因此它仍在同一进程中;但是,调整后的限制仅影响进程,以及从中运行的所有内容(子进程继承相同的限制)。

然而,./startup.sh作为分离过程——因此它成功地调整它自己的限制,但这不会神奇地向上传播到其父级。

(这与使用或导出的情况相同cd- 即使您可以在脚本中使用它们,但它们都会更改脚本自身进程的参数,而不是整个系统的参数,并且一旦脚本进程退出就会被遗忘。)

注意:另一个命令,prlimit它允许您调整另一个进程(由 PID 指定)的资源限制。脚本可以像这样更改其父进程的文件限制:

prlimit --pid=$PPID --nofile=4096

相关内容