【Linux】【编译相关】execvp: /bin/sh: Argument list too long问题处理小结

简介: 【Linux】【编译相关】execvp: /bin/sh: Argument list too long问题处理小结

问题背景


execvp: /bin/sh: Argument list too long问题出现的两种情况:


  • 1、make的时候,如编译Linux内核、驱动、Android版本等较长-I、-D选项的情况;


  • 2、shell操作,涉及较多文件的情况,如删除大量文件时,直接用rm;


问题原因


1、错误来源于sysdeps/gnu/errlist.c文件中:


[ERR_REMAP (E2BIG)] = N_("Argument list too long"),


可据此找到对应Linux内核中exec.c中返回E2BIG的地方,实际和ARG_MAX有很大关系。


2、参考APUE,ARG_MAX的值在运行时间不变的值,但值可能不确定。


ARG_MAX的值实际上和下面参数有关系:


 - MAX_ARG_STRLEN #单个字符串的最大大小
 - MAX_ARG_STRINGS #参数个数的限制
 - MAX_ARG_PAGES #分配给参数的最大页数
 - stack size #堆栈空间
 - ARG_MAX in limits.h #参数的最大长度


实际上,不同内核的版本也有区别。


几个命令执行情况的例子:


[qxhgd@localhost]getconf ARG_MAX
2897152
[qxhgd@localhost]ulimit -s
8192
[qxhgd@localhost]xargs --show-limits 
Your environment variables take up 4222 bytes
POSIX upper limit on argument length (this system): 2090882
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2086660
Size of command buffer we are actually using: 131072


问题解决


几种思路


  • 修改主机环境:


  • 调整shell命令或makefile本身;


修改主机环境


据说,Linux内核可通过修改下面参数来规避,具体没做实验。


/*
* 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


其他几个参数也可根据需要调整。


shell操作场景


  • 以rm为例,一般配合xargs利用管道来解决:
    find . -name “" | xargs rm -rf "” 就行


  • 也可以通过shell来执行:


#!/bin/bash
# 设定需要删除的文件夹
RM_DIR='/testdir/to-del-all'
cd $RM_DIR
for I in `ls`
do
  rm -f $I


make场景


1、对于-I路径


  • 去除冗余的-I路径


如某模块在增加-I路径的时候,没有确认是否真的需要,只是参考其他模块直接copy的。


  • 将路径包含设法缩短


如有的路径里有类似这种A/xx/yy…/…/的,就可以优化一下;
另外,也可以用软链接来缩短路径;


  • 将需要的头文件整合到一个目录中。


2、对于-D选项


  • 可以将相关-D选项生成.h文件,直接include相关.h文件。


命令汇总


getconf ARG_MAX     #查看系统配置参数ARG_MAX
sys/limits.h #头文件
xargs --show-limits #xargs查看各种参数的长度
MAX_ARG_STRLEN  #include/linux/binfmts.h文件
cat /proc/$$/environ | wc -c #查看环境变量长度;
ulimit -s  #查看或修改线程默认栈空间
echo $(( $(getconf PAGE_SIZE)*32 )) ##查看PAGE_SIZE


参考资料



  • APUE



相关文章
|
缓存 资源调度 DataWorks
DataWorks操作报错合集之DataWorks节点报错:OSError: [Errno 7] Argument list too long,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
508 1
|
Linux
删除大量文件和目录时报错:Argument list too long
这个目录下的文件数量我惊呆了。40W+ 的文件目录数量,直接报错了。
324 1
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之遇到“OSERROR: argument list too long”的错误,该如何处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
271 1
|
Java API
将`List<String>`转换为`List<Long>`
将`List<String>`转换为`List<Long>`
1451 0
四种解决”Arg list too long”参数列表过长的办法
这些方法都可以帮助你避免因参数列表过长而导致的错误。选择方法取决于具体情况和需求。
1052 0
|
存储 算法 Linux
深入理解Linux内存管理brk 和 sbrk 与以及使用C++ list实现内存分配器
深入理解Linux内存管理brk 和 sbrk 与以及使用C++ list实现内存分配器
1129 0
|
消息中间件 Linux 数据安全/隐私保护
探究Linux中消息队列和共享内存产生“Invalid Argument”错误的原因
在Linux操作系统中,消息队列和共享内存是进程间通信的常见方式。然而,有时候在使用这些机制时,可能会遇到“Invalid Argument”错误。本文将探讨导致此问题的可能原因,包括参数设置错误、权限问题、资源限制等,并提供相应解决方案。
1702 0
|
7月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
842 1
二、Linux文本处理与文件操作核心命令
|
7月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
484 137
|
7月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1315 59
下一篇
开通oss服务