避免 UNIX 和 Linux 中的常见错误(4)

./foo: /usr/bin/ls: 0403-027 The parameter list is too long.

一个程序在您的 IBM? AIX? 计算机上已经运行了几个月,没有出现问题。但是,在这个程序运行时,它每隔几分钟在同一个日志目录中创建文件。文件名以 f.<number> 和 e.<number> 开头。目录越来越满,ls 命令的响应时间显著增加。这是可以理解的,因为目录中的文件太多了。

又过了几个月,这个 AIX 程序一直运行,仍然没有问题。现在,有了 100,000 个以 f. 开头的文件和另外 100,000 个以 e. 开头的文件。现在,如果您试图清理这个日志目录,删除以 f. 开头的文件,就会收到以下消息:

# rm ~cormany/logs/f.* ksh: /usr/bin/rm: 0403-027 The parameter list is too long.  

我认为您太久没有清理文件了。但是,现在还不晚。

在执行 delete 等命令时,会在执行之前检查和展开所有参数。这个示例寻找 ~cormany/logs/f.*,这会展开为 rm 命令的 100,000 个参数。换句话说,实际上执行的并不是 rm ~cormany/logs/f.*,而是 rm ~cormany/logs/f.1 ~cormany/logs/f.2 ~cormany/logs/f.3 … ~cormany/logs/f.100000。

与其他 UNIXLinux 操作系统一样,AIX 规定了可以使用的命令行参数和环境变量的长度。在 AIX 中,可以使用 getconf 命令检查这个值。在 getconf 手册页上,应该会看到 ARG_MAX:

# man getconf … ARG_MAX Maximum length, in bytes, of the arguments for one of the exec subroutines, including environment data. … # getconf ARG_MAX 1048576  

这个值说明对于环境变量和命令行参数可以使用 1,048,576 字节。看起来您已经超过了这个上限。解决这个问题有两种方法:

使用 smitty chgsys 并修改 ARG/ENV list size in 4K byte blocks 以提高这个值,或者使用 chdev 提高这个值。我不建议在每次遇到这类错误时为了图方便修改系统范围的参数:这应该是最后一招。 不使用带 100,000 个参数的 rm 命令(这会执行失败),而是使用 find 命令删除文件,这会好得多: # find ~cormany/logs –name “f.*” –exec rm {} \;  

find 命令在目录中搜索以 f. 开头的所有文件,而不是在 shell 命令行中放那么多参数。然后,find 命令对找到的每个文件执行 rm,这样就会删除以 f. 开头的所有文件。

结束语

读完本文之后,您应该了解了这些常见问题,知道如何快速地解决问题。错误可能看起来很简单,但是在 UNIX 中您必须解决基本错误,才能顺利地前进。愿您能够顺利地排除故障!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24807.html