組み込みデバイスの起動時間を最適化するために、Debian の init スクリプトを手動で調整しています。これまでのところ、簡単に理解できる小さなスクリプトなど、「簡単に実行できるもの」だけで、起動時間を半分に短縮できました。
今では、実行に合計で約 20 秒かかる init スクリプトがいくつか残っています。他のスクリプトの経験に基づくと、ここでさらに 5 ~ 10 秒短縮できます。問題は、これらのスクリプトが、理解するのが/lib/init/
難しいヘルパー スクリプトをいくつかソースとしているため、私にとっては少々難しすぎることです (mount-functions.sh
これが最初の原因です)。
残りのスクリプトを理解しやすくして最適化できるようにするには、それらの init スクリプトを「事前処理」して、ファイルをソースするたびにスクリプト自体にインライン化され (もちろん再帰的に)、未使用の関数を削除してコードを整理する方法が必要です。そのためのツールはありますか?
答え1
このようなこともできます。軽くテストしただけですが、全体的なコンセプトは妥当だと思います。
例
次のようなファイルのディレクトリがあるとします。
$ 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
ファイルはtop.bash
次のようになります:
$ 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"
expander.bash
「展開」するには、次のスクリプトを使用できます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
実行例
$ ./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"
潜在的な機能強化?
1 つには と を使用しましたgrep
がsed
、これらを交換すると、より純粋な Bash ソリューションになります。これは大まかなプロトタイプなので、これを行うのに時間はかかりませんでした。
おそらく注意が必要な 2 番目の領域は、別のファイルのソースが行われていることをスクリプトが認識できるかどうかです。これを検出するパターンは、状況に応じて「調整」する必要があるでしょう。