Argument list too long......

作为一名运维人员来说,这个错误并不陌生,在执行rm、cp、mv等命令时,如果要操作的文件数很多,可能会使用通配符批量处理大量文件,这时就可能会出现“Argument list too long”这个问题了。

1、错误现象

这是一台Mysql数据库服务器,在系统中运行了很多定时任务,今天通过crontab命令又添加了一个计划任务,退出时发生了如下报错:


1

#crontab -e

编辑完成后,保存退出,就出现下面如下图所示错误:

2、解决思路

根据上面报错的提示信息,基本判定是磁盘空间满了,那么首先从检查服务器的磁盘空间开始,根据报错提示应首先检查/tmp磁盘空间,然后应该是根分区的磁盘空间,最好是系统其它分区的磁盘空间。

3、问题排查

通过df命令查看了这个服务器上所有磁盘分区的情况,/tmp分区空间还有很多,根分区也还有很大剩余空间,都不存在问题,最后发现是/var磁盘分区空间使用已经100%了,到这里已经定位了问题,是/var磁盘空间爆满导致的,因为crontab会在保存时写文件信息到/var目录下,由于这个磁盘没有空间了,报错也是理所当然了。

4、解决问题

接着通过“du -sh”命令检查/var目录下所有文件或目录的大小,发现/var/spool/clientmqueue目录占用了/var整个分区大小的90%,那么/var/spool/clientmqueue目录下的文件都是怎么产生的呢,是否能删除?下面简单介绍下/var/spool/clientmqueue目录的文件是怎么生成的。

可以打开/var/spool/clientmqueue目录下的一些文件看看,都是一些邮件信息,邮件内容大多是关于Cron Daemon的,其实/var/spool/clientmqueue就是一个邮件暂存的目录,linux服务器在默认情况下会发一些邮件,比如当cron执行的程序有输出内容时,就会发送邮件信息到执行cron进程的用户,系统在发送邮件时,首先会把邮件拷贝到/var/spool/clientmqueue目录下,然后等待MTA程序(mail transfer agent)来处理,而MTA主要的功能是把这个目录中的邮件转移到/var/spool/mqueue目录下,然后再通过sendmail服务发送到真正的目的地。于是检查了这个服务器的sendmail服务,发现没有开启,这样/var/spool/clientmqueue目录非常大的原因就找到了:没有发送邮件的客户端服务,所有邮件就都堆积在这个目录下了。

在确认完这些内容都没用后,切换到/var/spool/clientmqueue目录下,执行rm命令删除所有的文件时,出现了错误:


1

2

[[email protected] clientmqueue]# rm *

/bin/rm: argument list too long

此时出现了本文开头我们谈到的问题。

当Linux下试图传递太多参数给一个系统命令时,就会出现”Argument list too long”错误。这个是Linux系统一直以来都有的限制。查看这个限制可以通过命令“getconf ARG_MAX”来实现,如下图所示:

这是Centos6版本的一个最大值,而在Centos5.x中,这个值相对较小,如下图所示:

所以这个问题更多时候是发生在linux低版本中。

知道了产生问题的原因,解决方法就很多了,这里提供四种解决此问题的方法,分别介绍如下:

(1)手动把命令行参数分成较小的部分

例如:


1

2

rm [a-n]* -rf

rm [o-z]* -rf

这种方法里最简单的,但是相对较弱智,因为必须要知道怎么平均分割文件,同时对于文件数目极多的情况,需要输入很多遍命令。

(2)使用find命令删除

基本原理是通过find命令筛选文件列表,把符合要求的文件传递给一系列命令。这种方法是最简洁的,也就最有效的。

例如:


1

find /var/spool/clientmqueue -type f -print -exec rm -f {} \;

但是这种方法也有缺点:就是需要遍历所有文件,因而在文件数量极多时比较耗时。

(3) 通过shell脚本

这种方法是通过编写一个shell脚本,然后通过循序语句实现,与find方法类似。

例如,可以编写如下脚本:


1

2

#!/bin/bash

# 设定需要删除的文件夹


1

2

3

4

5

6

RM_DIR=‘/var/spool/clientmqueue‘

cd $RM_DIR

for in `ls`

do

 rm -f $I

done

(4)重新编译Linux内核

这种方法需要手动增加内核中分配给命令行参数的页数,打开kernel source下面的include/linux/binfmts.h文件,找到如下行:


1

# define MAX_ARG_PAGES  32

将”32“改为更大的值,例如64或128,然后重新编译内核。

此种方法永久有效,可以彻底解决问题,但是比较复杂,推荐给高级用户使用,没有Linux经验的用户不建议用这种方法。

本文出自 “技术成就梦想” 博客,请务必保留此出处http://ixdba.blog.51cto.com/2895551/1433379

时间: 2024-12-13 06:50:41

Argument list too long......的相关文章

sed: -i requires an argument Permission denied

在脚本中使用sed时,如果一行的内容较长,为了脚本美观要换行,在行尾添加"\"即可. 注意:如果在"\"之后添加空格,例如: sed -i "/^xxx=/s/.*/xxx=$xxx/"\[:space:]        $xxx echo $? [:space:]表示行尾有一个空格 脚本会报如下错误: sed: -i requires an argument./xxx.sh: line 20: xxx.sh: Permission denied

Name for argument type [java.lang.String] not avai

项目通过MyEclipe部署到Tomcat运行一切OK 使用Jekins,Ant进行管理,部署也OK,但是访问项目时就出现: Name for argument type [java.lang.String] not available, and parameter name information not found in class file either. 参考 http://m.blog.csdn.net/blog/kouwoo/42869779 采用第二种方法最活力,使用Ant编译ja

运维实战案例之“Argument list too long”错误与解决方法

作为一名运维人员来说,这个错误并不陌生,在执行rm.cp.mv等命令时,如果要操作的文件数很多,可能会使用通配符批量处理大量文件,这时就可能会出现"Argument list too long"这个问题了. 1.错误现象 这是一台Mysql数据库服务器,在系统中运行了很多定时任务,今天通过crontab命令又添加了一个计划任务,退出时发生了如下报错: #crontab -e 编辑完成后,保存退出,就出现下面如下图所示错误: 2.解决思路 根据上面报错的提示信息,基本判定是磁盘空间满了,

windows下启动redis提示Invalid argument during startup: Failed to open the .conf file: redis.windows.connf CWD=C:\Users\Administrator

环境:Windows 7 64bit 旗舰版 redis 3.2.100 64bit 开始的时候,redis运行的好好的,不过每次启动都要要进入其路径,挺麻烦的,所以就想把它的路径设置到环境变量里,然后直接运行就出现错误:Invalid argument during startup:Failed to open the .conf file: redis.windows.connf CWD=C:\Users\Administrator 网上搜索了好久也找不到解决办法.后来想是不是因为环境变量的

[Swift中错误]missing argument label 'greeting:' in call

Swift 中出现这个问题:从第二个参数起,自动加上lable func sayHello(name:String? ,greeting:String)->String { let result = greeting + "," + (name ?? "Guest") + "!" return result } var nickname:String? nickname = "yc" //“Goodmorning前面应该

iOS 开发之 Xcode installation failed invalid argument!

1.运行模拟器的时候 报出:installation failed invalid argument! 原因分析:我把Bundle indentifier 置为空了! http://stackoverflow.com/questions/27037589/xcode-6-1-installation-failed-invalid-argument-when-trying-to-run-today-appli/28193369

Cannot find an initializer for type '[(String)]' that accepts an argument list of type '(LazyForward

Swift编译错误: Cannot find an initializer for type '[(String)]' that accepts an argument list of type '(LazyForwardCollection<MapCollectionView<Dictionary<Int, String>, Int>>)' 错误代码: var dict = [1: "m", 2: "i", 3: "i

OK6410视频VIDIOC_QUERYBUF error 22, Invalid argument

试着去调一段代码,在OK6410上以Qt为界面显示出来,得到以下两个结果 1.VIDIOC_QUERYBUF error 22, Invalid argument 2.s3c-fimc: invalid target size 很无奈的我找到的资料都是问这个问题的,没有一个解决的 甚至于对OK6410的技术支持也无能为力的说查一下底层的驱动源码吧什么的 有时候出现错误1,有时候错误1和错误2同时出现. 能力有限,未能解决甚至不知道问题出在哪里

android创建一个细节页面,以及argument的应用

大家好..以前我也好奇过有没有一些设计模式可以用来创建一个细节页面,直到最近我看了一些设计模式相关的博文和书后,我终于发现了以下的应用. 下面我们介绍一个Listview 点击后出现一个detail 页面的功能,功能简单,但是我们看的是思想. 首先我们实现自定义的ListView,ListItem 里面有一个TextView,一个EditText,一个Checkbox,对应存放数据的是一个Crime的类.ListView里面有好多个ListItem,而对应的是CrimeList 类,为了方便创建

编译luabind-0.9.1 出现 error C2665: &#39;boost::operator ==&#39; : none of the 4 overloads could convert all the argument types 的解决方案

最终出错的位置是: #define LUABIND_OPERATOR_ADL_WKND(op) \  inline bool operator op( \      basic_iterator<basic_access> const& x \    , basic_iterator<basic_access> const& y) \  { \      return boost::operator op(x, y); \  } \ \  inline bool o