初回起動時にのみスクリプトを実行する


回答:


14

いいえ。ただし、スクリプトを/etc/init.d/scriptに配置して、自己削除することもできます。

#!/bin/bash

echo "Bump! I'm your first-boot script."

# Delete me
rm $0

$0bash固有(バージョン> = 3)であることに注意してください。互換性の目的のためには、代わりにスクリプトファイル名を指定することができ、このあまり一般的な作り:rm /etc/init.d/script
Andrejs Cainikovs

4
$ 0はbash固有ではなく、bash 3.xがサポートされていたよりもずっと長い間サポートされています(Bourne、Korn、zshなどでサポートされています)。こだわりのポイントは、$ 0に完全パス指定または相対パス指定が含まれているかどうかです。あなたがそれを必要とする場合はここで完全なパスを取得する信頼性の高い方法へのリンクがあります: stackoverflow.com/questions/4774054/...
ジム・デニス

7

スクリプトの実行時に追跡ファイルを作成します。ファイルが既に存在する場合は、スクリプトを終了します。


3
一見そうは思えないかもしれませんが、これはスクリプトを削除するよりも良い解決策かもしれません。
msanford

7

最初の2つの回答を組み合わせるスクリプト/usr/local/bin/firstboot.shに名前を付けると仮定すると/etc/rc.local(このスクリプトはすべてのブートで実行されます)、スクリプトは次のようになります。

#!/ bin / bash

FLAG = "/ var / log / firstboot.log"
if [!-f $ FLAG]; それから
   #ここに初期化文を入れてください
   echo "これが最初の起動です"

   #次の行は空のファイルを作成し、次のブートを実行しません
   $ FLAGをタッチします
そうしないと
   echo "何もしない"
fi

これは必ずしもsysmtemdで機能するとは限りません。スリープ20を追加して、最後のスクリプト実行であることを確認する必要があります。
mrossi 16

/etc/rc.local/99-firstboot.shという名前を付けると、最後に実行されるはずです。
-JohnDavid

3

明確に定義され、サポートされている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へのリンクはこちらです


0

現在のrc.localをrc.local.bakにバックアップできます

次に、rc.localでやりたいことを実行し、最後にmv /etc/rc.loca.bak /etc/rc.localを実行します。


0

問題は、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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.