Por que o seguinte modo não altera o tamanho do limite do arquivo principal?

3

Para resolver o problema no link , segui link , mas ele não define o tamanho limite do arquivo principal?

$ sudo sh -c "ulimit -c 1024 && exec su t"

$ ulimit -c
0
  1. Isso altera o tamanho do limite do arquivo principal temporariamente apenas para o shell atual ou permanentemente para todos os shells de todos os usuários ou do usuário atual?

  2. Atualização: A postagem original link e link e link tudo recomendado usando sudo sh -c "ulimit -c 1024 && exec su $LOGNAME" . Mas tanto ulimit -c 1024 quanto exec su $LOGNAME" afetam apenas o shell criado por sudo , então qual é o propósito do comando? exec su $LOGNAME" também não faz nada significativo para usar o limite alterado.

Observação: estou me concentrando no motivo pelo qual o modo acima não funciona, embora haja outras maneiras de contornar o problema:

  1. Eu devo colocar o comando que usa o novo valor limite dentro do shell executado pelo sudo

    por exemplo,

    $ sudo sh -c "ulimit -c 1024 && sleep 100"
    ^\Quit
    $ ls
    core
    
  2. Eu também poderia tentar modificar /etc/security/limits.conf .
por Tim 28.05.2018 / 14:14

5 respostas

0

Gostaria de abordar a parte:

https://stackoverflow.com/a/17483998/156458, https://unix.stackexchange.com/a/238413/674 and https://unix.stackexchange.com/a/169035/674 all recommended using sudo sh -c "ulimit -c 1024 && exec su $LOGNAME". But both ulimit -c 1024 and exec su $LOGNAME" only affects the shell created by sudo, so what is the purpose of the command? exec su $LOGNAME" also doesn't do anything meaningful to make use of the changed limit. I am very confused and wonder if I am missing something.

Eu fiz alguns experimentos e descobri que depois de executar

sudo sh -c "ulimit -c 1024 && exec su $LOGNAME"
  • ulimit -c 1024 de fato modifica os valores limite, mas somente dentro do shell em sudo sob o shell original;

  • exec su $LOGNAME" me dará um shell em su sob sudo sob o shell original e su $LOGNAME" redefinirá os limites para os valores padrão do usuário $LOGNAME .

Portanto, o comando sugerido pelos links não funciona.

para o tamanho do arquivo principal:

$ ulimit -c -H; ulimit -c;                                                                                                                                                        
unlimited
0
$ ulimit -c 1024
$ ulimit -c -H; ulimit -c;                                                                                                                                                        
1024
1024
$ ulimit -c 10000
bash: ulimit: core file size: cannot modify limit: Operation not permitted
$ sudo sh -c "ulimit -c 10000 && ulimit -c -H && ulimit -c && exec su $LOGNAME"
[sudo] password for t:
10000
10000
$ ulimit -c -H; ulimit -c;                                                                                                                                                        
unlimited
0

$ ~/bin/get-ancestry-processes.sh
systemd,1 splash
  └─lxterminal,1242,t
      └─bash,22778
          └─sudo,22800,root sh -c ulimit -c 10000 && ulimit -c -H && ulimit -c && exec su t
              └─su,22802 t
                  └─bash,22803,t
                      └─get-ancestry-pr,22819 /home/t/bin/get-ancestry-processes.sh
                          └─pstree,22820 -G -a -s -l -p -u 22819

para o número de arquivos abertos, para refazer a experiência no link , mas com um valor-limite diferente para definir para

$ ulimit -n -H; ulimit -n;                                                                                                                                                        
1048576
1024
$ ulimit -n 512
$ ulimit -n -H; ulimit -n;                                                                                                                                                        
512
512
$ ulimit -n 10000
bash: ulimit: open files: cannot modify limit: Operation not permitted
$ sudo sh -c "ulimit -n 10000 && ulimit -n -H && ulimit -n && exec su $LOGNAME"
10000
10000
$ ulimit -n -H; ulimit -n                                                                                                                                                         
1048576
1024
    
por 30.05.2018 / 01:50
7

De acordo com a página de manual, ulimit "fornece controle sobre os recursos disponíveis para o shell e para os processos iniciados por ele". Portanto, o valor ulimit é válido para o shell atual.

Você está invocando ulimit em uma subshell e, quando ela termina, você volta ao valor padrão ulimit .

[root@centos7 ~]# ulimit -c
0
[root@centos7 ~]# ulimit -c 1024
[root@centos7 ~]# ulimit -c
1024
    
por 28.05.2018 / 14:23
3

O comando ulimit funciona para o shell que o chama e para seus descendentes.

O comando su terá o limite que você configurou. O shell pai não é afetado.

    
por 28.05.2018 / 14:38
1

I am very confused and wonder if I am missing something

Acho que você está perdendo (ou não está reconhecendo) /etc/security/limits.conf Aqui está o modelo do Suse Linux Enterprise Server 11.4, e também como eu configurei globalmente o limite de tamanho de pilha para ilimitado em comparação com o padrão de 8KB.

# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - an user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open files
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to values: [-20, 19]
#        - rtprio - max realtime priority
#
*       hard    stack   unlimited
*       soft    stack   unlimited
*       hard    nofile  100000
*       soft    nofile  100000

Isso é do SLES, o nome e a localização limits.conf podem ser diferentes dependendo da sua distribuição do Linux. A configuração dos valores aqui será global e estará em vigor para todos / todos, em vez de usar ulimit , o que seria limitado ao escopo da janela do shell, conforme descrito.

Ser forwarned, configurar alguns itens de maneira incorreta pode impedir que você faça login no sistema

    
por 29.05.2018 / 19:47
0

Sua própria resposta agora contém as informações que já seriam necessárias na pergunta:

Seu sistema tem uma configuração incomum.

No Solaris, você tem os seguintes limites e o conjunto de recursos POSIX:

LC_ALL=C ulimit -aHS
-t: time(seconds) unlimited:unlimited
-f: file(blocks) unlimited:unlimited
-d: data(kbytes) unlimited:unlimited
-s: stack(kbytes) 10240:unlimited
-c: coredump(blocks) unlimited:unlimited
-n: nofiles(descriptors) 256:65536
-v: memory(kbytes) unlimited:unlimited

No Linux, você tem os seguintes limites típicos:

ulimit -aSH
-t: time(seconds) unlimited:unlimited
-f: file(blocks) unlimited:unlimited
-d: data(kbytes) unlimited:unlimited
-s: stack(kbytes) 8192:unlimited
-c: coredump(blocks) 0:unlimited
-m: memoryuse(kbytes) unlimited:unlimited
-u: processes(count) 26633:26633
-n: nofiles(descriptors) 1024:1048576
-l: memlock(kbytes) 64:64
-M: addressspace(kbytes) unlimited:unlimited
-L: locks(count) unlimited:unlimited
-i: sigpending(count) 26633:26633
-q: messagequeues(count) 819200:819200
-e: schedpriority(nice) 0:0
-r: rtpriority(nice) 0:0
-R: rttime(usec) unlimited:unlimited

Como você vê, o limite rígido é muito maior que o seu. Esta é a razão pela qual ninguém conseguiu entender seus problemas.

Como um usuário comum pode aumentar os limites flexíveis para os limites físicos, a solicitação em sua pergunta não precisaria de privilégios de root.

    
por 30.05.2018 / 10:17