
Envolvi meu script R /usr/lib/R/bin/exec/R
para limitar o uso de memória: renomeei-o para /usr/lib/R/bin/exec/R_orig
e criei um script bash nomeado /usr/lib/R/bin/exec/R
com o conteúdo:
#!/bin/bash
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
/usr/lib/R/bin/exec/R_orig "$@"
Esta é uma grande melhoria na minha experiência com esse programa específico, mas descobri que algumas partes dele realmente usam o nome do executável para determinar os caminhos de instalação do pacote e, como o nome do executável é modificado, eles falham.
É possível fazer com que meu script /usr/lib/R/bin/exec/R
seja visto como executável por si só - de modo que, por exemplo, top
não mostre um processo filho separado R_orig
, mas apenas o processo R
?
Responder1
Não faça isso. Ao substituir o original R
por algo que gera uma string na saída padrão, você pode confundir aplicativos que podem analisar sua saída.
Em vez disso, crie o script wrapper com um novo nome e deixe o R
executável original como estava. Não coloque esse script em /usr/lib/R/bin/exec
algum lugar como /usr/local/bin
(se ele precisar ser acessível a todos os usuários). Além disso, isso não confundirá atualizações de pacotes posteriores ou scripts de desinstalação.
Alternativamente, você pode definir uma função shell em seus arquivos de inicialização do shell:
myR () (
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
exec /usr/lib/R/bin/exec/R "$@"
)
Outra opção óbvia seria definir o limite nos scripts de inicialização do shell ( ~/.bashrc
for bash
). O limite será transferido para qualquer processo iniciado no shell.
Responder2
Para responder à sua pergunta, altere a linha final do seu script para
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"
Isso substituirá o processo atual (o shell que executa o script) pelo programa R_orig em vez de executar o R_orig como filho do script. Além disso passará o nome do programa, o tradicional primeiro argumento como nome original. A maioria dos programas que procuram a instalação de pacotes usará esse primeiro nome.
Concordo com @Kusalananda que é uma má ideia exibir a mensagem "Memória limitada a 10G". Se você quiser fazer isso, envie-o para stderr. Isso significa que seu script deve ficar assim.
#!/bin/bash
echo "Memory limited to 10G" >&2
ulimit -Sv 10000000 #limit memory for 64-bit version
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"