Planeie o script de shell (inclua scripts originados) e remova as funções não utilizadas

3

Estou modificando manualmente os scripts de inicialização do Debian para otimizar o tempo de inicialização de um dispositivo incorporado. Até agora eu reduzi-lo pela metade apenas com os "frutos baixos pendurados" ou seja. os scripts menores que são fáceis de entender.

Agora eu fiquei com alguns scripts de inicialização que levam cerca de 20 segundos para serem executados no total. Com base na experiência dos outros scripts, posso ganhar outros 5 a 10 segundos aqui. O problema é que esses scripts são um pouco difíceis de compreender, porque eles criam vários scripts auxiliares de /lib/init/ , que são difíceis de seguir ( mount-functions.sh sendo o primeiro culpado).

Para facilitar a compreensão desses scripts remanescentes para que eu possa otimizá-los, gostaria de "pré-processar" esses scripts de inicialização para que, sempre que eles acessarem um arquivo, ele seja embutido no próprio script ( recursivamente, é claro) e remova as funções não usadas para organizar o código. Existe uma ferramenta para isso?

    
por syam 04.10.2013 / 22:00

1 resposta

1

Você poderia fazer algo assim. Eu apenas o testei 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 arquivo top.bash tem esta aparência:

$ 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ê pode 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 exemplo, usei grep e sed , eles poderiam ser trocados para torná-lo uma solução Bash mais pura. Eu não tive tempo para fazer isso, já que este é um protótipo bruto.

A segunda área que provavelmente precisará de atenção é a habilidade dos scripts de descobrir que uma fonte de outro arquivo está ocorrendo. O padrão que detecta isso provavelmente precisará ser "ajustado" com base na sua situação.

    
por 04.10.2013 / 23:47