回答:
いいえ。ただし、スクリプトを/etc/init.d/script
に配置して、自己削除することもできます。
#!/bin/bash
echo "Bump! I'm your first-boot script."
# Delete me
rm $0
最初の2つの回答を組み合わせるスクリプト/usr/local/bin/firstboot.sh
に名前を付けると仮定すると/etc/rc.local
(このスクリプトはすべてのブートで実行されます)、スクリプトは次のようになります。
#!/ bin / bash FLAG = "/ var / log / firstboot.log" if [!-f $ FLAG]; それから #ここに初期化文を入れてください echo "これが最初の起動です" #次の行は空のファイルを作成し、次のブートを実行しません $ FLAGをタッチします そうしないと echo "何もしない" fi
明確に定義され、サポートされているUbuntuの「最初のブート」フックを検索した結果に驚きました。Red Hat / Fedora / CentOSの群衆は10年以上にわたってこれを打ち付けてきたようだ。Ubuntuに最も近いものはoem-config-firstbootのようです。
単にrm $0
遺言状を実行するというアイデアは機能します。しかし、技術的には、いくつかの興味深いセマンティクスが関係しています。Unixの他のほとんどのスクリプトインタープリターとは異なり、シェルスクリプトは一度に1行/文ずつ読み取られて処理されます。rm
ファイルをその下からリンク解除()すると、そのスクリプトを処理しているシェルのインスタンスが匿名ファイル(開いているがリンクされていないファイル)で動作するようになります。
このようなファイルを考えてみましょう:
#!/bin/bash
rm $0
echo "I've removed myself: $0"
ls -l $0
cat <<COMMENTARY
This is a test.
I'm still here, because the "here" doc is being fed to 'cat'
via the anonymous file through the open file descriptor.
But I cannot be re-exec'd
COMMENTARY
exec $0
それを次のようなものに保存しrmself.sh
、(ハード)リンクをそのようなものにリンクするとtst
、実行./tst
すると出力として次のようなものが表示されます。
$ ./tst
I've removed myself: ./tst
ls: ./tst: No such file or directory
This is a test.
I'm still here, because the "here" doc is being fed to 'cat'
via the anonymous file through the open file descriptor.
But I cannot be re-exec'd
./tst: line 11: /home/jimd/bin/tst: No such file or directory
./tst: line 11: exec: /home/jimd/bin/tst: cannot execute: No such file or directory
これで、シンボリックリンクに関する奇妙なコーナーケースと、スクリプトが裸の名前で呼び出されたケースがいくつかあります(シェルに$PATH
スクリプトを強制的に検索させます)。
しかし、bash
(少なくともバージョン3.2では)$0
パスを検索する場合はパスを先頭に追加し、そうでない場合はスクリプトの呼び出しに使用された相対パスまたは絶対パスに$ 0を設定したままにするようです。正規化や解決の相対パスやシンボリックリンクは行わないようです。
おそらくUbuntuで最もクリーンな「firstboot」は、配置/etc/init.d/firstboot
するスクリプトと、update-rc.d
ランレベル1(/etc/rc1.d
)にリンクするために使用するインストール後スクリプトを含む小さなパッケージ(.deb)を作成することです(次のようなコマンドを使用update-rc.d firstboot defaults
)。 ..そして、次のようなものを使用して、最後の行で非アクティブ化または削除を実行します。update-rc.d firstboot disable
Debian update-rc.d HOWTOへのリンクはこちらです
問題は、EC2の最初の起動時にスクリプトを実行することでした。cloud-init
この目的に使用できます。
新しいEC2インスタンスを起動すると、あなたは定義するオプション持ってUser data
下にAdvanced datails
。あなたが置く場合はcloud-init
そこにスクリプトを、それだけで最初の起動時に実行されます。
たとえば、次の場所に配置できますUser data
。
#cloud-config
runcmd:
- /usr/bin/command1.sh
- /usr/bin/command2.sh
出力はに書き込まれます /var/log/cloud-init-output.log
Cloud-init
これ以上のことができます。特に、クラウドインスタンスの初期初期化を実行するように設計されています。こちらのドキュメントをご覧ください:http : //cloudinit.readthedocs.io/en/latest/index.html
$0
bash固有(バージョン> = 3)であることに注意してください。互換性の目的のためには、代わりにスクリプトファイル名を指定することができ、このあまり一般的な作り:rm /etc/init.d/script