Linux下传递参数时的Argument list too long错误

这篇文章是回复前几天在论坛一个朋友提出的问题,今天有空,整理了一下,发布出来,供大家参考!

当Linux下试图传递太多参数给一个系统命令(ls *; cp *; rm *; cat *; etc…)时,就会出现”Argument list too long”错误。本文将提供4种解决方法,按复杂程度由低到高排列。

方法#1: 手动把命令行参数分成较小的部分

例1

mv [a-l]* ../directory2

mv [m-z]* ../directory2

这是4种方法里最简单的,但是远非理想的方法。你必须有办法平均分割文件,而且对于文件数目极多的情况,需要输入N遍命令。

方法#2: 使用find命令

例2

方法2通过find命令筛选文件列表,把符合要求的文件传递给一系列命令。

优点是find命令有很强大的筛选功能,而且,也许是最重要的,这个方法只需要1行命令。

唯一的缺点是, 方法2需要遍历文件,因此耗时较多。

方法#3: 建立函数

例3

#!/bin/bash

# 设定需要删除的文件夹

RM_DIR='/data/files'

cd $RM_DIR

for I in `ls`

do

rm -f $I

done

方法#4:重新编译Linux内核

最后一个方法需要2个字:谨慎,这个方法很高级,因此没有经验的linux用户最好不要尝试。此外,在永久使用前,务必在系统环境中全面测试。

方法4只需要手动增加内核中分配给命令行参数的页数。打开include/linux/binfmts.h文件,在文件起始附近位置有以下几行:

/*

* MAX_ARG_PAGES defines the number of pages allocated for arguments

* and envelope for the new program. 32 should suffice, this gives

* a maximum env+arg of 128kB w/4KB pages!

*/

#define MAX_ARG_PAGES 32

为了增加分配格命令行参数的内存,只需要赋给MAX_ARG_PAGES一个更大的值,保存,重新编译,安装,重启,搞定

在我的系统中,我把MAX_ARG_PAGES的值增加到64,就解决了所有问题。在改变这个值后,我还没有遇到任何问题。这是可以理解的,当MAX_ARG_PAGES被改为64,最长的参数行仅占用256KB系统内存–对于现在的硬件标准不算什么。

方法4的优点很明显,现在你只要像通常一样运行命令。缺点也很明显,如果分配给命令行的内存大于可用的系统内存,可能导致对系统自身的拒绝服务攻击(DoS attack),引起系统崩溃。尤其是对于多用户系统,即使增加很小的内存分配都会有很大影响,因为每个用户都被分配到额外内存。因此一定要充分测试来决定是否你的系统可以使用方法4。

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

时间: 2024-11-16 06:34:58

Linux下传递参数时的Argument list too long错误的相关文章

[Remoting FAQ]传递Remoting参数时遇到的两种常见错误

[Remoting FAQ] 传递Remoting参数时遇到的两种常见错误 Version Date Creator Description 1.0.0.1 2006-4-25 郑昀@Ultrapower 草稿   继续阅读之前,我们假设您熟悉以下知识: n         Remoting [现象1] 我们先来描述一个简单的错误.当你激活远端Remoting Objects时,却得到了这样的错误提示: 提示信息 Type 'Common.BTRequest' in Assembly 'Comm

嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类:   嵌入式(928)  一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈.   [cpp] vie

Linux下进程崩溃时定位源代码位置

前几天领导安排一个小项目,大意是解决这样一个问题: 在Linux系统下,进程可能由于各种原因崩溃,此时我们要找到出问题的源代码在某一个文 件的具体行号,这样调试起来就会方便,高效很多,可能是公司项目要用到,想想挺有意思的,加上自己本身是个Linux狂热者,最终花了两三天解决了这个问 题,当然我的领导我们称之为专家指点了我很多,废话少说,下面是解决问题的思路和步骤以及自己的一些想法   解 决该问题的大体思路是这样的:在Linux下,进程崩溃时内核(也就是我们所谓的操作系统)会向进程发送信号,比如

linux下ls命令时显示目录的相关提示文字等信息

用途: 给下一任服务器管理员一些指示,以便于其管理服务器.原本打算 cd 时就提示这些内容,可是不知道怎么用子 shell 控制父 shell 的目录.不过现在这样也好,相比于cd命令,使用ls时会更想知道这个目录的更多信息. 操作步骤: 1.创建目录 ~/bin 2.创建文件 ~/bin/tipls #!/bin/bash # # ls 时显示目录提示文字 # 需要目录中有 .dirtip 文件 # root@upall.cn # 2015-03-26 11:52:56 # ls $* --c

如何解决LINUX下安装ORACLE时SWAP不足问题

当前磁盘分区及SWAP分区情况如下: [root@bys3 ~]# fdisk -l Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot      Start         End      Blocks   Id  System /dev/sda1  

linux下cp目录时排除一个或者多个目录的实现方法

说明:/home目录里面有data目录,data目录里面有a.b.c.d.e五个目录,现在要把data目录里面除过e目录之外的所有目录拷贝到/bak目录中 方法一:终端命令行下执行以下命令 cp -R `find /home/data -type d -path /home/data/e -prune -o -print | sed 1d ` /bak########################################################脚本实现脚本存放路径/home/o

xcode NSMutableURLRequest,在POST方式下传递参数

 代码如下 复制代码 - (IBAction)upload:(id)sender {       NSString *post = nil;        post = [[NSString alloc] initWithFormat:@"message=%@",@"hello,world."];       NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConv

linux下利用backtrace追踪函数调用堆栈以及定位段错误

一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈.   [cpp] view plain copy    print? int backtrace(void **buffer,int size)   该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buf

Linux下phpmyadmin出现1036 Table XXX is read only 错误

我的Mysql数据库在由Mssql数据库导入数据文件后出现"ERROR 1036 (HY000): Table 'xxxx' is read only"的错误提示,由于对Mysql了解不多,一时没找到解决方法,经过在网上搜索并测试,问题得到了解决,其方法就是在Linux命令行下输入下面命令 1.先修改数据库文件为777(可读写执行)权限.代码如下: chmod 777 -R /usr/local/mysql/var/finance/ 注:finance 为我的数据库文件,777为修改权