Perl ::无法分叉32000进程

use*_*233 0 perl

我正在编写一个Perl脚本,它分叉32000个进程,每个进程执行24小时的一系列操作.但我无法分叉那么多进程.任何解决方法?请注意,代码适用于较少数量的进程.这是我得到的错误:

pty_allocate(nonfatal): posix_openpt(): No space left on device at /usr/local/lib64/perl5/IO/Pty.pm line 24.
pty_allocate(nonfatal): getpt(): No such file or directory at /usr/local/lib64/perl5/IO/Pty.pm line 24.
pty_allocate(nonfatal): getpt(): No such file or directory at /usr/local/lib64/perl5/IO/Pty.pm line 24.
pty_allocate(nonfatal): openpty(): No such file or directory at /usr/local/lib64/perl5/IO/Pty.pm line 24.
pty_allocate(nonfatal): open(/dev/ptmx): No space left on device at /usr/local/lib64/perl5/IO/Pty.pm line 24.
Run Code Online (Sandbox Code Playgroud)

Dav*_*man 6

你的问题不在于Perl,这是一个操作系统限制.您的内核只允许分配有限数量的ptys,这是全局(系统范围)限制,而不是每用户或每进程限制.

假设您在Linux下运行,请man 7 pty告诉我们

在内核(包括2.6.3)中,此限制在内核编译时配置(CONFIG_UNIX98_PTYS),允许的伪终端数最多可达2048,默认设置为256.自内核2.6.4起,限制为通过/ proc/sys/kernel/pty/max动态调整,相应的文件/ proc/sys/kernel/pty/nr表示当前正在使用的伪终端数量.

因此,如果您使用的是相对较新的(2.6.4或更高版本)Linux内核,则应该可以使用它cat /proc/sys/kernel/pty/max来查看系统范围内的最大pty计数.

根据这个文档(我自己没有尝试过验证),您应该能够通过编辑/etc/sysctl.conf和添加行kernel.pty.max = 5120(或任何数字)来更改限制,然后使用sysctl -p重新加载sysctl配置.

但请注意,每个pty都需要分配其他系统资源(内存,文件句柄等),因此将最大ptys增加到任意大的数量可能会对系统的其余部分造成非常糟糕的事情.