作为一名运维人员来说,这个错误并不陌生,在执行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
[root@localhost 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

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

  1. tomcat启动时候报错Can't convert argument: null

    一.启动报错: 为了避免导入的项目重名,我先修改了前一个项目的名称. 重新启动该项目至tomcat,报错:java.lang.IllegalArgumentException: Cant conver ...

  2. file_put_contents 错误:failed to open stream: Invalid argument 一种原因

    今天在测试nilcms系统的时候,出现了一个报错,导致缓存无法更新: file_put_contents(C:\UPUPW_AP5.4\vhosts\d.tv\NilCMS_APP\include_r ...

  3. fdisk添加分区引起的Linux Error: 22: Invalid argument

    在Linux服务器(虚拟机)上使用fdisk添加分区.格式化分区后,遇到了Linux Error: 22: Invalid argument错误,操作步骤如下所示 [root@oracle-serve ...

  4. -bash: ulimit: pipe size: cannot modify limit: Invalid argument

    从root账号切换到oracle账号时,出现了"-bash: ulimit: pipe size: cannot modify limit: Invalid argument"提示 ...

  5. diff/merge configuration in Team Foundation - common Command and Argument values - MSDN Blogs

    One of the extensibility points we have in Team Foundation V1 is that you can configure any other di ...

  6. -bash: /bin/rm: Argument list too long

    使用rm * -f删除缓存目录文件时,报如下错误 -bash: /bin/rm: Argument list too long 提示文件数目太多. 解决的办法是使用如下命令: ls | xargs - ...

  7. 【安卓】aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creating directories: Invalid argument

    这几天在使用.aidl文件的时候eclipse的控制台总是爆出如下提示: aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creatin ...

  8. senlin __init__() got an unexpected keyword argument 'additional_headers'

    从senlin源码重新编译更新了服务,然后执行 senlin的 cli就遇到了错误: __init__() got an unexpected keyword argument 'additional ...

  9. could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const std::string'

    VS2008, 写一个简单的demo的时候出现了这个: 1>------ Build started: Project: GetExportTable, Configuration: Relea ...

  10. -[NSBundle initWithURL:]: nil URL argument'

    今天早上同事突然跟我说趣拍的SDK不能用了,一调用就crash,我一听就纳了闷了,原来好好的啊. 然后就开始查呗,马上就要上线了,不搞好,老大会不会杀了我... 搞个全局断点,就停在了一堆我看不懂的界 ...

随机推荐

  1. Android课程---布局管理器之相对布局(二)

    这次示例代码是相对布局中兄弟组件之间,设置按钮的位置,难度:*****,一定要注意有同方向和反方向之分: 1.同方向 1)layout_alignLeft 同方向左对齐 2)layout_alignR ...

  2. SignalR in a WebSite Project

    Question(http://stackoverflow.com/questions/19924678/signalr-in-a-website-project)  I have a test we ...

  3. 一个ICMP单元

    unit ICMPUtils; interface {$IFDEF VER80} { This source file is *NOT* compatible with Delphi 1 becaus ...

  4. linux入命令基础

    查看系统版本: cat /proc/version lsb_release -a uname -a 查看进程: ps ps aux |grep #查询字符串 杀掉进程:  kill #标号 强制杀掉: ...

  5. 【行业交流】2016 TiD质量竞争力大会——移动互联网测试到质量的转变之路

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5691233.html TiD质量大会在北京召开,有幸去参加 ...

  6. Wordpress实现站搜索

    wordpress内置的搜索表单如下 <form role="search" method="get" id="searchform" ...

  7. T-sql创建表,插入数据

    SET NOCOUNT ON; USE hibernateSqlServer GO IF OBJECT_ID('Orders') IS NOT NULL DROP TABLE Orders; GO I ...

  8. perl基础

    perl比较好的博客:http://www.cnblogs.com/cosiray/archive/2012/03/18/2404371.html 以分析一个简单的pm文件为例 # # オプションの取 ...

  9. 分析app和wap手机网站的不同

    随着手机3G.4G时代的到来,手机功能的越来越强大,手机App的市场是越来越火爆,时代在更新随之而来的事物也在更新,不能更上时代的步伐是落后的表现,所以不仅仅是手机APP在完善,手机网站WAP也在不断 ...

  10. [转] CentOS单独安装Apache Benchmark压力测试工具的办法

    Apache安装包中自带的压力测试工具 Apache Benchmark(简称ab) 简单易用,这里就采用 ab作为压力测试工具了. 1.独立安装 ab运行需要依赖apr-util包,安装命令为: 1 ...