Linux下傳遞參數時的Argument list too long錯誤

來源:互聯網
上載者:User

這篇文章是回複前幾天在論壇一個朋友提出的問題,今天有空,整理了一下,發布出來,供大家參考!

當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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.