Como executar o ulimit em um script com outro aplicativo

2

Temos o seguinte script (no CentoS 6) em nosso laboratório para executar nossos aplicativos com sua saída um por um.

cd A/
sleep 1
gnome-terminal -t A --tab -e "./app1"
cd ../B/
sleep 1
gnome-terminal -t b --tab -e "./app2" 
sleep 2
gnome-terminal -t c --tab -e "./app3"

Isso está funcionando perfeitamente.

Agora, o que queremos é gerar arquivos de despejo principais para um de nossos aplicativos (por exemplo, app3) ulimit -c mostra 0 por padrão e não quero alterar seu valor padrão.

gnome-terminal -t c --tab -e "ulimit -c unlimited ; ./c" não está funcionando. Quando o googled descobriu que, para executar um script, ele deveria ser sh -c "ulimit -c unlimited" .

gnome-terminal -t c --tab -e "sh -c "ulimit -c unlimited" está funcionando perfeitamente.
Mas, gnome-terminal -t c --tab -e "sh -c "ulimit -c unlimited ; ./app3" NÃO está funcionando.

Como posso ativar o despejo principal apenas para app3? OBSERVAÇÃO: não queremos isso globalmente.

    
por Tejas 18.07.2017 / 08:01

2 respostas

2

Existem três maneiras de fazer isso.

Use um comando de carregamento de corrente adequado.

Em vez de usar o comando interno shell ulimit , use comandos que foram desenvolvidos para esse propósito, a partir de vários conjuntos de ferramentas daemontools-family :

Então, um seria executado, usando softlimit do conjunto de ferramentas como um exemplo:

gnome-terminal -t A --tab -e "softlimit --coresize unlimited ./app1"

Use um subshell dentro do script.

Isso também aplica o limite ao processo do emulador de terminal. Neste caso, isso será bastante benigno. Mas se alguém estiver aplicando outros limites, como limites de identificadores de arquivos abertos ou limites de bifurcação de processos, isso pode ser problemático.

(ulimit -c unlimited ; urxvt -e "./app1")

Note que isto não funcionará com o Terminal GNOME ou com a variante cliente-servidor do Unicode RXVT . Ambos não invocam diretamente o emulador de terminal como filho do seu script. Eles executam uma chamada remota por meio de um processo do servidor, que não terá nem adquirirá os limites de recursos definidos no seu script.

Faça o Terminal GNOME executar um shell que executa ulimit .

Lembre-se de que você precisa construir isso de baixo para cima.

  1. Você deseja que o shell real que executa o trabalho execute a lista de comandos
    ulimit -c unlimited ; exec "./app1"
  2. Para passar essa lista de comandos para sh , ele precisa ser todos um argumento após -c , portanto, precisa ser citado:
    sh -c "ulimit -c unlimited ; exec \"./app1\""
  3. Para passar a invocação sh para o Terminal GNOME, isso também precisa ser todos um argumento após -e , então um segundo nível de cotação precisa ser aplicado:
    gnome-terminal -e 'sh -c "ulimit -c unlimited ; exec \"./app1\""'
por 18.07.2017 / 13:57
0

ulimit -c não lhe dará o limite máximo, ele fornecerá o limite flexível. O limite rígido só pode ser alterado pelo superusuário e o limite suave pode ser alterado por qualquer pessoa. Alterar o limite suave afetará apenas esse processo.

No MacOS:

$ charlie on macbook in ~
❯❯ ulimit -aS
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 7168
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

$ charlie on macbook in ~
❯❯ ulimit -aH
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 65532
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1064
virtual memory          (kbytes, -v) unlimited

No seu caso, o limite rígido é provavelmente ilimitado e o limite flexível é 0 por padrão. Você pode alterar o limite flexível nesse processo, usando ulimit ou editando o arquivo /proc/FD/limits diretamente.

    
por 18.07.2017 / 09:39