पर्यावरण चर मूल्य का अधिकतम आकार क्या है?


84

क्या लिनक्स पर एक पर्यावरण चर में संग्रहीत डेटा की मात्रा की सीमा है, और यदि ऐसा है: तो यह क्या है?

Windows के लिए, मैंने KB आलेख का अनुसरण किया है जो संक्षेप में बताता है: Windows XP या बाद में: 8191 वर्ण Windows 2000 / NT 4.0: 2047 वर्ण


खिड़कियों पर वास्तविक सीमा 31,767 है। आप setकमांड के बारे में पढ़ते हैं , जिसमें इसकी कमांड सीमा 8191 अक्षर है। यह एमएसडीएन लेख देखें फिर भी एक यादृच्छिक सीमा, हालांकि।
क्रिस्टोफर कर्रेंस

5
8191 यह यादृच्छिक नहीं है। यह 2 ^ 13 - 1. है
Barnaby Dawson

AWS लैम्ब्डा: सेट का कुल आकार [पर्यावरण चर] 4 केबी ( स्रोत ) से अधिक नहीं है
मार्टिन थोमा

1
@BarnabyDawson शायद क्रिस्टोफर का मतलब इस अर्थ में था कि यह मनमाना था?
0xC0000022L

जवाबों:


76

मुझे नहीं लगता कि लिनक्स पर प्रति-पर्यावरण चर सीमा है। सभी पर्यावरण चर का कुल आकार execve()समय पर सीमित है । अधिक जानकारी के लिए "तर्क और पर्यावरण के आकार पर सीमाएं" यहां देखें।

एक प्रक्रिया निष्पादन द्वारा आवंटित प्रारंभिक स्थान से परे पर्यावरण का उपयोग setenv()या putenv()विकसित करने के लिए हो सकती है ।

यहां एक त्वरित और गंदा कार्यक्रम है जो 256 एमबी पर्यावरण चर बनाता है।


5
+1 निष्पादित () जानकारी के लिए। आप वास्तव में (कम से कम) 8M तक पर्यावरण चर जोड़ सकते हैं, लेकिन निष्पादन () कॉल नहीं चलेगी। यह अपने आप को "तर्क सूची बहुत लंबा है" के रूप में बैश में प्रकट करता है जब भी आप तब एक कमांड चलाने की कोशिश करते हैं।
पैक्सिडाब्लो

1
यह भी ध्यान दें कि POSIX के लिए ARG_MAX की आवश्यकता कम से कम
_POSIX_ARG_MAX

10
AskUbuntu पर शीर्ष उत्तर (चिपका द्वारा)xargs --show-limits अधिक जानकारी प्राप्त करने के लिए चर्चा करता है ।
DocSalvager

मैं प्रति स्ट्रिंग स्ट्रिंग की सीमा भी देखता हूं - "इसके अतिरिक्त, स्ट्रिंग की सीमा 32 पृष्ठ है (कर्नेल निरंतर MAX_ARG_STRLEN)"
kiran01bm

24

खैर, यह मेरे बॉक्स पर कम से कम 4M है। उस बिंदु पर, मैं ऊब गया और भटक गया। उम्मीद है कि सोमवार को काम पर वापस आने से पहले टर्मिनल का उत्पादन खत्म हो जाएगा :-)

export b1=A
export b2=$b1$b1
export b4=$b2$b2
export b8=$b4$b4
export b16=$b8$b8
export b32=$b16$b16
export b64=$b32$b32
export b128=$b64$b64
export b256=$b128$b128
export b512=$b256$b256
export b1k=$b512$b512
export b2k=$b1k$b1k
export b4k=$b2k$b2k
export b8k=$b4k$b4k
export b16k=$b8k$b8k
export b32k=$b16k$b16k
export b64k=$b32k$b32k
export b128k=$b64k$b64k
export b256k=$b128k$b128k
export b512k=$b256k$b256k
export b1m=$b512k$b512k
export b2m=$b1m$b1m
export b4m=$b2m$b2m
echo $b4m
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
:    :    :    :    :    :    :    :    :    :    :    :
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

यदि आप चिंतित हैं कि 4M आपके पर्यावरण चर के लिए पर्याप्त नहीं हो सकता है, तो आप चीजों को कैसे करना चाहते हैं, इस पर पुनर्विचार करना चाहते हैं।

शायद जानकारी को किसी फ़ाइल में डालना बेहतर होगा और फिर उस फ़ाइल को संदर्भित करने के लिए एक पर्यावरण चर का उपयोग करें। मैंने ऐसे मामले देखे हैं, जहां यदि चर रूप है @/path/to/any/fspec, तो यह फ़ाइल से वास्तविक जानकारी प्राप्त करता है path/to/any/fspec। यदि यह इसके साथ शुरू नहीं होता है @, तो यह पर्यावरण चर के मान का उपयोग करता है।


दिलचस्प रूप से पर्याप्त है, उन सभी चर सेटों के साथ, हर एक कमांड शिकायत करना शुरू कर देता है कि तर्क सूची बहुत लंबी है, भले ही यह आपको उन्हें सेट करने की अनुमति देता है, हो सकता है कि यह आपके द्वारा किए जाने के बाद प्रोग्राम शुरू करने में सक्षम न हो (जब से इसे करना है पर्यावरण को उन कार्यक्रमों में पास करें)।


1
मुझे आशा है कि आपने एक स्क्रिप्ट का उपयोग किया था, और यह सब हाथ से टाइप नहीं किया था!
क्रिस हुआंग-लीवर

2
नहीं, इसलिए "ऊब" हो रही है। वी-मोड कमांड लाइन संपादन ने इसे थोड़ा आसान बना दिया, लेकिन मुझे लगा कि 4M मार्क को हिट करने से पहले यह विफल हो सकता है। C'est la vie।
paxdiablo


@ LưuV LnhPhúc: क्योंकि कार्यक्रमों की सीमाएँ हैं। वे मनमानी सीमाएं हो सकती हैं या वे उपलब्ध संसाधनों पर आधारित हो सकती हैं, लेकिन सीमाएं मौजूद हैं। काफी संभवतः डेविड ने माना कि उसका खोल गलतफहमी से इस्तेमाल नहीं होगा (जिसे गलत पता होना चाहिए :-)
paxdiablo

7

मैंने निम्नलिखित स्निपेट के साथ अपने लिनक्स बॉक्स पर एक त्वरित परीक्षण किया:

a="1"
while true
do
    a=$a$a
    echo "$(date) $(numfmt --to=iec-i --suffix=B --padding=7 ${#a})" 
done

मेरे बॉक्स पर (Gentoo 3.17.8-gentoo-r1) में यह परिणाम (आउटपुट की अंतिम पंक्तियाँ):

Wed Jan  3 12:16:10 CET 2018   16MiB
Wed Jan  3 12:16:11 CET 2018   32MiB
Wed Jan  3 12:16:12 CET 2018   64MiB
Wed Jan  3 12:16:15 CET 2018  128MiB
Wed Jan  3 12:16:21 CET 2018  256MiB
Wed Jan  3 12:16:33 CET 2018  512MiB
xrealloc: cannot allocate 18446744071562068096 bytes

तो: सीमा काफी अधिक है!


1
18446744071562068096 बाइट्स लगभग 15 एक्साबाइट हैं। :) कि 512MiB से एक बड़ी छलांग की तरह लगता है।
माक्र्स

1
@Marcus: यह है ... मुझे लगता है कि किसी तरह 1Gb यानी 1073741824 बाइट्स यानी 2 ^ 30 बाइट्स कहीं-कहीं ओवरफ्लो हो जाते हैं। 18446744071562068096 त्रुटि में बाइट्स की संख्या 2 ^ 64 के करीब सुंदर है यानी 18446744073709551616
साइबरबर्ड

1
मेरे पास सी / जीडीबी कौशल सीमित है, लेकिन मुझे लगता है कि समस्या bash स्रोत फ़ाइल subst.c में है। फ़ंक्शन sub_append_string (पंक्ति 726) नए आकार की गणना करने के लिए n नामक एक हस्ताक्षरित अंतर चर का उपयोग करता है। नया आकार (2 ^ 31) फिट होगा लेकिन एक संरेखण गणना है: n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE); और मुझे इस भाग पर संदेह है: (n + DEFAULT_ARRAY_SIZE)ओवरफ्लो। सब बहुत अच्छा है, लेकिन हम यहाँ किसी भी सीमा से परे
संभोग

3

यहाँ दो सहायक आदेश दिए गए हैं:

  • getconf -a |grep MAX

  • true | xargs --show-limits


~ 100 चर में से कौन सा प्रासंगिक है? वे दस्तावेज कहां हैं?
ingomueller.net

1

ठीक से पता नहीं है, लेकिन एक त्वरित प्रयोग से पता चलता है कि कोई त्रुटि नहीं होती है जैसे कि मूल्य का 64kB:

% perl -e 'print "#include <stdlib.h>\nint main() { return setenv(\"FOO\", \"", "x"x65536, "\", 1); }\n";'\
| gcc -x c -o envtest - && ./envtest && echo $?
0

1

मैंने इसे बहुत जल्दी और गंदे php कोड (नीचे) का उपयोग किया, इसे विभिन्न मूल्यों के लिए संशोधित किया, और पाया कि यह 128k तक की चर लंबाई के लिए काम करता है। उसके बाद, जो भी कारण से, यह काम नहीं करता है; कोई अपवाद नहीं उठाया गया है, कोई त्रुटि नहीं बताई गई है, लेकिन मूल्य उप-क्रम में नहीं दिखा है।

शायद यह एक php- विशिष्ट सीमा है? शायद वहाँ php.ini सेटिंग्स हैं जो इसे प्रभावित कर सकती हैं? या हो सकता है कि var के आकार की कोई सीमा है जो एक सबहेलिट इनहेरिट करेगा? हो सकता है कि प्रासंगिक कर्नेल या शेल कॉन्फिग सेटिंग्स हों ..

वैसे भी, डिफ़ॉल्ट रूप से, CentOS में, php में putenv के माध्यम से वातावरण में एक var सेट करने की सीमा लगभग 128k लगती है।

<?php

  $s = 'abcdefghijklmnop';
  $s2 = "";
  for ($i = 0; $i < 8100; $i++) $s2 .= $s;
  $result = putenv('FOO='.$s2);
  print shell_exec('echo \'FOO: \'${FOO}');
  print "length of s2: ".strlen($s2)."\n";
  print "result = $result\n";
?>

संस्करण की जानकारी -

[root@localhost scratch]# php --version
PHP 5.2.6 (cli) (built: Dec  2 2008 16:32:08) 
<..snip..>

[root@localhost scratch]# uname -a
Linux localhost.localdomain 2.6.18-128.2.1.el5 #1 SMP Tue Jul 14 06:36:37 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

[root@localhost scratch]# cat /etc/redhat-release 
CentOS release 5.3 (Final)

0

कमांड लाइन (सभी तर्क के साथ) पर्यावरण चर कम होना चाहिए फिर 128k।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.