환경 변수 값의 최대 크기는 얼마입니까?


85

Linux에서 환경 변수에 저장할 수있는 데이터의 양에 제한이 있습니까? 그렇다면 : 무엇입니까?

Windows의 경우 다음에 요약 된 KB 문서 를 찾았 습니다. Windows XP 이상 : 8191 자 Windows 2000 / NT 4.0 : 2047 자


창에 대한 실제 제한은 31,767입니다. set명령 줄이 8191 자로 제한되어 있는 명령 에 대해 읽었습니다 . 이 msdn 기사를 참조하십시오 .
Christopher Currens

5
8191은 그렇게 무작위가 아닙니다. 2 ^
Barnaby Dawson

AWS Lambda : [환경 변수] 집합의 총 크기가 4KB ( 소스 )를 초과하지 않음
Martin Thoma

1
@BarnabyDawson 아마도 Christopher는 그것이 임의적이라는 의미에서 그것을 의미했을까요?
0xC0000022L

답변:


77

Linux에는 환경 별 변수 제한이 없다고 생각합니다. 합쳐진 모든 환경 변수의 총 크기는 execve()시간에 제한됩니다 . 자세한 내용은 여기 에서 "인수 및 환경 크기 제한" 을 참조하십시오.

프로세스는 exec가 할당 한 초기 공간 이상으로 환경을 사용 setenv()하거나 putenv()확장 할 수 있습니다 .

다음은 256MB 환경 변수를 생성하는 빠르고 더러운 프로그램입니다.


5
execve () 정보에 +1. 실제로 (최소) 8M까지 환경 변수를 추가 할 수 있지만 exec () 호출은 작동하지 않습니다. 이것은 명령을 실행하려고 할 때마다 bash에서 "인수 목록이 너무 깁니다"로 나타납니다.
paxdiablo

1
또한 POSIX에서는 ARG_MAX가 _POSIX_ARG_MAX 이상이어야하며 4096이어야합니다.
ninjalj

10
askUbuntu의 최상위 답변 (Chipaca)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
스크립트를 사용 하셨기를 바라며이 모든 것을 손으로 입력하지 않았 으면합니다!
Chris Huang-Leaver 2009-07-03

2
아니, 따라서 "지루해지기"조금. Vi-mode 명령 줄 편집은 조금 더 쉬웠지만 4M 표시에 도달하기 전에 실패 할 것이라고 생각했습니다. C'est la vie.
paxdiablo

1
그런데 왜 ksh 변수가 256K에서 멈추 나요? 아마도 CentOS
phuclv

@ LưuVĩnhPhúc : 프로그램에는 한계가 있기 때문입니다. 임의의 제한이거나 사용 가능한 리소스를 기반으로 할 수 있지만 제한이 있습니다. :-) 잘 알고 있어야 미치광이에 의해 사용 아마도 DavidK가 가정 자신의 쉘되지 않을 것 (어긋나)
paxdiablo

7

다음 스 니펫을 사용하여 Linux 상자에서 빠른 테스트를 수행했습니다.

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에서 큰 도약 인 것 같습니다.
Marcus

1
@Marcus : 그건 ... 1Gb, 즉 1073741824 바이트, 즉 2 ^ 30 바이트가 어딘가에 오버플로되는 것 같아요. 오류 18446744071562068096의 바이트 수는 2 ^ 64에 매우 가깝습니다. 즉 18446744073709551616
cyberbird

1
C / gdb 기술이 제한되어 있지만 문제가 bash 소스 파일 subst.c에 있다고 생각합니다. sub_append_string 함수 (726 행)는 n이라는 서명 된 int 변수를 사용하여 새 크기를 계산합니다. 새로운 크기 (2 ^ 31)는 맞지만 정렬 계산이 있습니다. n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE); 그리고 부분이 (n + DEFAULT_ARRAY_SIZE)오버플로 되는 것 같습니다 . 모두 매우 멋지지만 우리는 여기에 정상적인 한계를 넘어서는 방법입니다 ..
cyberbird

3

다음은 두 가지 유용한 명령입니다.

  • getconf -a |grep MAX

  • true | xargs --show-limits


~ 100 개의 변수 중 관련성이있는 것은 무엇입니까? 어디에 문서화되어 있습니까?
ingomueller.net 2010

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 설정이 있습니까? 아니면 서브 쉘이 상속 할 vars의 크기에 제한이 있습니까? 관련 커널 또는 셸 구성 설정이있을 수 있습니다.

어쨌든 기본적으로 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 미만이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.