Como envolver um comando para que um script, em vez de seu filho, apareça como executável?

2

Envolvi meu script R /usr/lib/R/bin/exec/R para limitar o uso de memória: renomei para /usr/lib/R/bin/exec/R_orig e criei um script bash chamado /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 "$@"

Este é um grande aprimoramento da minha experiência com esse programa em particular, 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 o executável por si só - para que top não mostre um processo filho separado R_orig , mas apenas o processo R ?

    
por Valentas 29.04.2017 / 10:39

2 respostas

3

Não faça isso. Ao substituir o original R por algo que produz uma string para a saída padrão, você pode confundir aplicativos que possam analisar sua saída.

Em vez disso, crie o script wrapper com um novo nome e deixe o executável R original como estava. Não coloque este script em /usr/lib/R/bin/exec , mas em algum lugar como /usr/local/bin (se precisar ser acessado por todos os usuários). Isso também não irá confundir atualizações posteriores de pacotes ou scripts de desinstalação.

Você pode, alternativamente, definir uma função de 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 em seus scripts de inicialização do shell ( ~/.bashrc for bash ). O limite será transferido para qualquer processo iniciado a partir do shell.

    
por 29.04.2017 / 10:47
1

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 está executando o script) pelo programa R_orig, em vez de executar o R_orig como um filho do script. Além disso, passará o nome do programa, o primeiro argumento tradicional como o nome original. A maioria dos programas que consultam a instalação do pacote usa esse nome.

Concordo com @Kusalananda que é uma má idéia enviar a mensagem "Memória limitada a 10G". Se você quiser fazer isso, envie 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 "$@"
    
por 25.09.2017 / 15:03

Tags