Estou ajustando manualmente os scripts de inicialização do Debian para otimizar o tempo de inicialização de um dispositivo incorporado. Até agora, reduzi pela metade apenas com os "frutos mais fáceis de alcançar", ou seja. os scripts menores que são fáceis de entender.
Agora fico com alguns scripts de inicialização que levam cerca de 20 segundos para serem executados no total. Com base na experiência de outros scripts, posso ganhar mais 5 a 10 segundos aqui. O problema é que esses scripts são um pouco difíceis de entender porque eles fornecem vários scripts auxiliares /lib/init/
que são difíceis de seguir ( mount-functions.sh
sendo o primeiro culpado).
Para tornar os scripts restantes mais fáceis de entender para que eu possa otimizá-los, gostaria de alguma forma de "pré-processar" esses scripts de inicialização para que sempre que eles originarem um arquivo, ele seja embutido no próprio script (recursivamente, é claro ) e remova as funções não utilizadas para organizar o código. Existe uma ferramenta para isso?
Responder1
Você poderia fazer algo assim. Eu testei apenas levemente, mas acho que o conceito geral é sólido.
Exemplo
Digamos que você tenha o seguinte diretório de arquivos:
$ ls -l
total 16
-rwxrwxr-x 1 saml saml 268 Oct 4 17:44 expander.bash
-rw-rw-r-- 1 saml saml 18 Oct 4 16:49 src_1.bash
-rw-rw-r-- 1 saml saml 20 Oct 4 16:50 src_2.bash
-rwxrwxr-x 1 saml saml 119 Oct 4 16:49 top.bash
O top.bash
arquivo fica assim:
$ cat top.bash
#!/bin/bash
echo "1"
echo "2"
echo "3"
echo "4"
. src_1.bash
echo "15"
echo "16"
. src_2.bash
echo "27"
echo "28"
Você poderia usar o seguinte script expander.bash
para "expandir" top.bash
:
#!/bin/bash
while read -r line; do
if echo "$line" | grep -q '\. .*'; then
file=$(echo "$line" | sed 's/\. //')
echo "### below sourced from: $file"
cat $file
echo "### above sourced from: $file"
continue
fi
printf "%s\n" "$line"
done < top.bash
Exemplo de execução
$ ./expander.bash
#!/bin/bash
echo "1"
echo "2"
echo "3"
echo "4"
### below sourced from: src_1.bash
echo "6"
echo "7"
### above sourced from: src_1.bash
echo "15"
echo "16"
### below sourced from: src_2.bash
echo "17"
echo "18"
### above sourced from: src_2.bash
echo "27"
echo "28"
Melhorias potenciais?
Por um lado, usei grep
e sed
, eles poderiam ser trocados para torná-lo uma solução Bash mais pura. Não perdi tempo para fazer isso, pois este é um protótipo rudimentar.
A segunda área que provavelmente precisará de atenção é a capacidade dos scripts de descobrir que está ocorrendo a origem de outro arquivo. O padrão que detecta isso provavelmente precisará ser "ajustado" com base na sua situação.
Responder2
Resposta de @slmme inspirou a escreverachatar.sh.
flatten.sh
não incluirá o arquivo inteiro a ser originado. Em vez disso, ele buscará apenas as funções definidas no arquivo, que são realmente usadas no script que está sendo nivelado.
Isso é útil se você mantiver um arquivo "lazy.lib" que, por sua vez, fornece TODAS as funções que você usa. Basta inserir "lazy.lib" em seu script durante o desenvolvimento e nivelá-lo quando terminar.