He estado viendo un comportamiento extraño al alterar las variables de entorno. Estoy configurando una variable de entorno muy larga y esto impide ejecutar cualquier comando:
( Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-66-generic x86_64) )
$ export A=$(python -c "print 'a'*10000000")
$ env
-bash: /usr/bin/env: Argument list too long
$ ls
-bash: /bin/ls: Argument list too long
$ cat .bashrc
-bash: /bin/cat: Argument list too long
$ id
-bash: /usr/bin/id: Argument list too long
Que está sucediendo aquí ?
Respuesta1
La lista de argumentos y el entorno de un comando se copian en el mismo espacio de la memoria cuando se inicia un programa. El mensaje de error es "Lista de argumentos demasiado larga", pero en realidad el error exacto es que la lista de argumentos más el entorno es demasiado larga.
Esto sucede como parte delexecve
llamada al sistema. La mayoría, si no todas, las variantes de Unix tienen un límite en el tamaño de este espacio temporal. La razón de este límite es evitar que un programa malicioso o con errores haga que el kernel use una gran cantidad de memoria fuera del espacio de memoria de ese programa.
Elestándar POSIXespecifica que el tamaño máximo de este espacio de memoria debe ser al menos ARG_MAX
y que elvalor mínimode eso ( _POSIX_ARG_MAX
) es 4096. En la práctica, la mayoría de las variantes de Unix permiten más que eso, pero no 10 MB. Puede verificar el valor en su sistema con getconf ARG_MAX
. En los sistemas Linux modernos, el máximo es 2 MB (con la configuración típica). Tradicionalmente, muchos sistemas tenían un límite de 128 kB. Linux también todavía tiene unLímite de 128 kB para el valor de un solo argumento o la definición de una variable de entorno.
Si necesita pasar más de unos pocos cientos de bytes de información, páselo en un archivo.