توضیحی در مورد خطای bash- Argument list too long

خطای Argument list too long یکی از خطاهای رایج در محیط لینوکس می باشد که معمولا در زمان کار با تعداد زیادی از فایل در یک دایرکتوری رخ می دهد:

 [root@LinuxHost mydir]# rm –rf *.html

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

[root@LinuxHost mydir]# cp * /dir1

-bash: /usr/bin/cp: Argument list too long

[root@LinuxHost mydir]# ls -l *

-bash: /usr/bin/ls: Argument list too long

همانطور که از متن خطا مشخص است، تعداد آرگومانهای دستور(که به جای علامت ستاره  قرار می گیرند)، از حد مشخصی بیشتر است.

ls -l file1 file2 file3 … fileN

توضیح آنکه، به صورت پیش فرض، حداکثر طول آرگومانهای یک دستور در محیط لینوکس، برابر با مقدار ARG_MAX می باشد:

[root@LinuxHost  ~]# getconf ARG_MAX

2097152

رخ دادن خطای Argument list too long، به نشانه تجاوز تعداد آرگومانها از عدد تعیین شده برای ARG_MAX خواهد بود و برای جلوگیری از رخ دادن این خطا می توان ARG_MAX را به عدد بالاتری تنظیم کرد.

البته امکان تنظیم مستقیم ARG_MAX وجود ندارد و با توجه به آنکه مقدار ARG_MAX به سایز stack بستگی دارد، برای افزایش مقدار آن باید اندازه stack را افزایش داد.

توجه: ARG_MAX نسبت ¼ با اندازه stack  دارد.

در ادامه خطای Argument list too long را با افزایش مقدار stack و متعاقب آن افزایش مقدار ARG_MAX برطرف می کنیم.

مقدار جاری stack بر اساس کیلوبایت:

[root@LinuxHost  ~]# ulimit -s

8192

تغییر مقدار stack در سطح session:

[root@LinuxHost  ~]# ulimit -s 55555555

با تغییر مقدار stack به عددی بالاتر(به صورت random)، خواهیم دید که حذف محتویات دایرکتوری mydir (که در ابتدای متن با خطا متوقف شد)، بدون خطا قابل انجام خواهد بود:

[root@LinuxHost  mydir]# rm -rf *

[root@LinuxHost  mydir]# ls -l

total 0

برای تنظیم مقدار stack به حداکثر مقدار ممکن آن، می توان از دستور زیر استفاده کرد:

[root@LinuxHost  mydir]# ulimit -s unlimited

[root@LinuxHost  mydir]# getconf ARG_MAX

4611686018427387903

البته تغییر مقدار stack برای رفع خطای Argument list too long، تنها راه چاره نیست و حتی توصیه هم نمی شود. راهکارهای دیگری برای حل این مسئله وجود دارند که در ادامه سه مورد از آنها را مشاهده می کنید:

راهکار اول:

[root@LinuxHost mydir]# find . –name ‘*.html’ | xargs rm –f

[root@LinuxHost mydir]# ls –l

total 0

راهکار دوم:

[root@LinuxHost mydir]# for i in `ls`; do rm -f $i; done

راهکار سوم:

[root@LinuxHost ~]# mv /root/jasper/mydir    /root/mydir-old

[root@LinuxHost ~]# mkdir -p  /root/jasper/mydir

[root@LinuxHost ~]# rm -rf /root/mydir-old

 

 

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.