Linux:如何更改进程可以打开的最大文件数?

标签 linux sockets operating-system system ulimit

我必须在一组机器上执行一个进程。集群的大小为 100。所以我不能手动执行进程,我必须通过脚本执行它们(它使用 ssh,目前我为此使用 python-paramiko)。这些进程打开的 tcp 套接字数量超过 1024(linux 的默认限制)。所以我需要使用 {ulimit -n 10000} 更改它。这只会对该 shell session 进行更改。并且此命令仅适用于 root 用户。所以我的脚本无法做到这一点。 我尝试执行这个命令

sudo su && ulimit -n 10000 && <commandToExecuteMyProcess>

但这没有用。 “sudo su”之后的命令根本没有执行。它们仅在我注销 su session 时执行。 This文章展示了永久进行更改的方法。但是当我打开 limits.conf 时,我在那里找不到任何东西。它只有一些注释。

请建议我一些永久增加限制或通过脚本为每个 session 更改限制的方法。

最佳答案

它不是这样工作的:sudo su 只是打开一个新的 shell,这样您就可以以 root 身份引入命令,并且在您退出该 shell 后,它会以普通用户身份执行该行的其余部分。

第二:你这是一个特例,因为 ulimit 实际上不是一个程序,而是一个 bash shell 内置命令,所以它必须在 bash 中使用,这就是为什么像 >sudo ulimit -n 10000 将不起作用:sudo 找不到该程序,因为它不存在。

所以,唯一的选择有点难看但有效:

 sudo bash -c 'ulimit -n 10000 && <command>'

'...' 中的所有内容都将在 root 用户的 bash session 中执行。

请注意,在这种情况下,您可以将 && 替换为 ;:那是因为它是以 root 身份执行的,而 ulimit -n 10000 将总是成功完成。

关于Linux:如何更改进程可以打开的最大文件数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41322923/

相关文章:

linux - 如何从多行文件中读取变量?

java - HttpURL连接 : BindException when creating many connections

c# - Java 或 C# 的线程是基于用户空间线程还是内核空间线程?

linux - 一旦线程被让出,操作系统会切换到偶像进程执行吗?

c - 了解低级文件例程

c - 如何丢弃子进程的标准输出但保留父进程的标准输出?

linux - KVM Windows 2008 RC2 客户机上不可靠的 QueryPerformanceCounter

linux - 在 while 循环条件中设置变量

python - 通过套接字接收的总字节数与实际文件大小不同

c++ -::socket 返回 0 并且::connect 将 errno 设置为 EBADF