Executa partes de .bashrc de forma assíncrona

7

Eu tenho algumas exportações e outras coisas que requerem que outro programa seja executado (para obter caminhos ou qualquer outro) e eles levam um tempo não trivial para executar, o que significa que meu tempo de inicialização é da ordem de 5 segundos. / p>

Antes de eu sair e adicionar algum cache básico no meu .bashrc , existe uma maneira de executar algo de forma assíncrona que me permita exportar variáveis no meu shell em execução?

(Então, isso realmente não está limitado a .bashrc , mas bash em geral.)

    
por Daniel Huckstep 19.01.2011 / 06:53

4 respostas

2

Depende muito de quando esses programas precisam ser executados e quando você precisa dos resultados. Se não importa quando eles são executados (ou seja, os resultados não variam com o tempo), talvez seja melhor executá-los a partir do ~/.profile ou ~/.bash_profile (ou seja, quando você faz login) do que do seu ~/.bashrc .

Se você precisar de seus resultados, mas não puder esperar os 5 segundos que eles levam para executá-los, o que você fará nos primeiros 5 segundos que seu shell estiver funcionando? Você não pode executar nenhum comando que dependa das saídas desses programas, porque os resultados ainda não estarão disponíveis.

Acho que, se você descrever com mais detalhes exatamente quais são os requisitos, poderemos dar a você melhores respostas.

Tudo isso dito, você poderia lançar seus programas em segundo plano, como sugerido por Dennis Williamson, e fazer com que eles escrevessem seus resultados para alguns arquivos em seu diretório pessoal. Em seguida, você pode definir a variável bash PROMPT_COMMAND para fornecer esses arquivos, o que o bash faria antes de cada exibição de PS1 .

Por exemplo, digamos que seu programa em segundo plano grave export ans=42 no arquivo ~/answer quando estiver pronto. No seu ~/.bashrc , coloque

PROMPT_COMMAND=". ~/answer"

Em seguida, toda vez que o shell exibir PS1 , primeiro ele acessará ~/answer e seu ambiente eventualmente (por exemplo, 5 segundos após o início) conterá a variável ans com o valor 42 .

Naturalmente, nos primeiros 5 segundos depois de iniciar o shell, ~/answer conterá os valores do último tempo em que você iniciou um shell, então você precisa decidir se isso é importante ( e como redefinir esse arquivo, se necessário).

    
por 19.01.2011 / 09:17
1

Não tenho conhecimento de nenhuma maneira que possa definir as variáveis em segundo plano. No entanto, você pode executar scripts em segundo plano de forma que eles sejam executados em paralelo, em vez de sequencialmente, enquanto capturam sua saída. Isso pode acelerar a execução. Você pode usar os descritores de arquivo 3-9 com este método para um total de 7 processos paralelos.

Para ficar claro, todos os comandos executados devem terminar antes de gerar o shell interativo para usar suas saídas nas variáveis de configuração.

Esta solução permite que partes do script sejam executadas em paralelo ao restante do script (neste caso, o .bashrc )

function copget { read -u $1; echo "$REPLY"; }

coproc DATE { date; }
exec 3<&${DATE[0]}

coproc UNAME { uname; }
exec 4<&${UNAME[0]}

var1=$(copget 3)
exec 3>&-

var2=$(copget 4)
exec 4>&-
    
por 19.01.2011 / 07:46
0

Você pode usar um "e" comercial para executar um processo em segundo plano.

some_program &

No entanto, o programa não poderá afetar diretamente o ambiente do shell que o iniciou.

Você não deve ter nenhum processo de execução longa nos arquivos de inicialização.

    
por 19.01.2011 / 07:26
0

Você pode querer pensar em balancear a carga de trabalho entre seu perfil, que é executado uma vez, e seu arquivo bashrc, que é executado sempre que você inicia uma ação (interativa). Eu mantenho meu bashrc mínimo - então eu começo rápido. Meu perfil não é tão ruim - é complexo, mas certamente não leva 5 segundos.

    
por 19.01.2011 / 09:42