AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 446472
Accepted
Tim
Tim
Asked: 2018-05-29 04:14:04 +0800 CST2018-05-29 04:14:04 +0800 CST 2018-05-29 04:14:04 +0800 CST

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

  • 772

Para resolver o problema em https://unix.stackexchange.com/a/446428/674 , segui https://stackoverflow.com/a/17483998/156458 , mas ele não define o tamanho do limite do arquivo principal?

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

$ ulimit -c
0
  1. Dessa forma, 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 https://stackoverflow.com/a/17483998/156458 e https://unix.stackexchange.com/a/238413/674 e https://unix.stackexchange.com/a/169035/674 todos recomendados usando sudo sh -c "ulimit -c 1024 && exec su $LOGNAME". Mas ambos ulimit -c 1024e exec su $LOGNAME" afetam apenas o shell criado por sudo, então qual é o objetivo 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 a maneira acima não funciona, embora existam outras maneiras de contornar o problema:

  1. 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.
bash ulimit
  • 5 5 respostas
  • 7623 Views

5 respostas

  • Voted
  1. dr_
    2018-05-29T04:23:33+08:002018-05-29T04:23:33+08:00

    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 ulimitvalor é válido para o shell atual.

    Você está invocando ulimitem um subshell e, quando ele termina, você volta ao ulimitvalor padrão.

    [root@centos7 ~]# ulimit -c
    0
    [root@centos7 ~]# ulimit -c 1024
    [root@centos7 ~]# ulimit -c
    1024
    
    • 8
  2. schily
    2018-05-29T04:38:25+08:002018-05-29T04:38:25+08:00

    O ulimitcomando funciona para o shell que o chama e para seus descendentes.

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

    • 4
  3. ron
    2018-05-30T09:47:48+08:002018-05-30T09:47:48+08:00

    Estou muito confuso e me pergunto se estou perdendo alguma coisa

    Acho que você está faltando (ou não está reconhecendo) /etc/security/limits.conf Aqui está o modelo do Suse Linux Enterprise Server 11.4 e também como defino globalmente o limite de tamanho da pilha como ilimitado versus o padrão de 8 KB.

    # /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 limits.confnome e o local podem ser diferentes dependendo da sua distribuição do linux. Definir os valores aqui será global e estará em vigor para tudo/todos, em vez de usar ulimit , o que seria limitado ao escopo da janela do shell, conforme descrito.

    Esteja avisado, definir alguns itens incorretamente pode impedir que você faça login no sistema

    • 2
  4. Best Answer
    Tim
    2018-05-30T15:50:06+08:002018-05-30T15:50:06+08:00

    Eu gostaria de abordar a parte:

    https://stackoverflow.com/a/17483998/156458 , https://unix.stackexchange.com/a/238413/674 e https://unix.stackexchange.com/a/169035/674 todos recomendados usando sudo sh -c "ulimit -c 1024 && exec su $LOGNAME". Mas ambos ulimit -c 1024e exec su $LOGNAME"afetam apenas o shell criado pelo sudo, então qual é o objetivo do comando? exec su $LOGNAME"também não faz nada significativo para usar o limite alterado. Estou muito confuso e me pergunto se estou perdendo alguma coisa.

    Fiz alguns experimentos e descobri que depois de executar

    sudo sh -c "ulimit -c 1024 && exec su $LOGNAME"
    
    • ulimit -c 1024de fato, modifique os valores limite, mas apenas dentro do shell sob sudoo shell original;

    • exec su $LOGNAME"me dará um shell sob suo sudoshell original e su $LOGNAME"redefine os limites para os valores padrão para user $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 número de arquivos abertos, para refazer o experimento em https://unix.stackexchange.com/a/238413/674 , mas com um valor limite diferente para definir como

    $ 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
    
    • 0
  5. schily
    2018-05-31T00:17:48+08:002018-05-31T00:17:48+08:00

    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 hard limit é muito maior que o seu. Esta é a razão pela qual ninguém poderia entender seus problemas.

    Como um usuário comum tem permissão para aumentar os limites suaves para os limites rígidos, a solicitação em sua pergunta não precisaria de privilégios de root.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve