mac上の仮想マシンを自動起動・自動停止するスクリプト

スポンサーリンク
スポンサーリンク

はじめに

macOS上に構築した仮想マシンは、仮想マシンを起動したままホストとなるmacOSをシャットダウンしたりすると強制終了扱いとなり、仮想マシンのファイルが破損したりすることがあります。

これを防ぐために仮想マシンをmacOSに連動させて自動的に起動・停止するためのスクリプトです。

使用しているスクリプトは、githubにvm-configurateとして公開しているのでgithubからダウンロードするかここからダウンロードしてください。

vm-configurateのフォルダ構成については、下のリンクを参照してください。

スクリプトの実行には、VirtualBoxとVagrantが必要です。インストールされていない場合は、下のリンクを参照してください。

/host-osx/ubuntu-20.04/com.collbow.vagrant.plist

macOSでは、launchdを使って定期的にスクリプトを実行させることが出来ます。com.collbow.vagrant.plistファイルは、keyタグと設定値でペアとなっているXML形式の設定ファイルで、スクリプトを実行するための構成を設定しlaunchctlコマンドを使ってlaunchdに登録しています。

launchdへの登録は、/host-osx/ubuntu-20.04/vm-create.commandを参照してください。

key設定値内容
Labelcom.collbow.vagrant識別名を設定します。
ProgramArguments<array>
<string>sh</string>
<string>[SCRIPT_DIR]/com.collbow.vagrant.sh</string>
</array>
実行するプログラムとパラメータを設定します。
[SCRIPT_DIR]は、/host-osx/ubuntu-20.04/vm-create.commandでスクリプトの実行ディレクトリに置換されてlaunchdに登録されます。
RunAtLoadtruetrueの場合は、設定がロードされるとProgramArgumentsに設定されたプログラムが実行されます。
ExitTimeOut60launchdによってスクリプトが停止されようとした時に待機する時間を設定します。
時間が短いと仮想マシンの終了前に強制終了されます。
WorkingDirectory[SCRIPT_DIR]作業ディレクトリを設定します。
[SCRIPT_DIR]は、/host-osx/ubuntu-20.04/vm-create.commandでスクリプトの実行ディレクトリに置換されてlaunchdに登録されます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.collbow.vagrant</string>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>[SCRIPT_DIR]/com.collbow.vagrant.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ExitTimeOut</key>
    <integer>60</integer>
    <key>WorkingDirectory</key>
    <string>[SCRIPT_DIR]</string>
  </dict>
</plist>

/host-osx/ubuntu-20.04/com.collbow.vagrant.sh

launchdによってmacOSの起動時と停止時に実行されるスクリプトです。

スクリプトファイルの場所をカレントディレクトリにしています。

SCRIPT_DIR=$(dirname "$0")
cd "$SCRIPT_DIR"

スクリプトの実行結果を実行スクリプトファイル名の後ろに.logを付けたファイル(com.collbow.vagrant.sh.log)へ出力するように設定し、ログファイルへ実行開始日時を出力しています。

LOG_FILE="${0%.*}.log"
date "+%Y/%m/%d %H:%M:%S" >> $LOG_FILE

launchdによって実行されたスクリプトは、/usr/local/bin、/usr/binにPATHが通っていないのでPATHを設定しています。

また、bashの初期設定ファイル(.bash_profile)が存在する場合は、.bash_profileの環境変数を読み込んでいます。

export PATH=$PATH:/usr/local/bin:/usr/bin
if [ -e "${HOME}/.bash_profile" ]; then
    . "${HOME}/.bash_profile"
fi

スクリプトの実行プロセスを停止する必要がある時に呼び出されるコールバック関数を定義しています。

macOSのシャットダウンなどによりスクリプトを停止する時にこのコールバック関数が呼び出され、停止処理を開始した日時をログに出力し、vagrant haltで現在のディレクトリにあるVagrantfileを読み込みVagrantfileに定義されている仮想マシンを停止しています。

osascriptで仮想マシンが正常に停止できた場合は通知メッセージを表示しています。

onShutdown() {
    date "+%Y/%m/%d %H:%M:%S" > $LOG_FILE
    echo "Collbow VMs is Stopping." >> $LOG_FILE
    vagrant halt >> $LOG_FILE
    echo "Collbow VMs is stopped." >> $LOG_FILE
    osascript -e 'display notification "Collbow VMs is stopped." with title "Collbow VMs"'
    exit
}

vagrant upで現在のディレクトリにあるVagrantfileを読み込みVagrantfileに定義されている仮想マシンを起動しています。

osascriptで仮想マシンが正常に起動できた場合は通知メッセージを表示しています。

echo "Collbow VMs is starting." >> $LOG_FILE
vagrant up >> $LOG_FILE
echo "Collbow VMs is started." >> $LOG_FILE
osascript -e 'display notification "Collbow VMs is started." with title "Collbow VMs"'

macOSからのシグナルをトラップしています。

macOSからSIGHUP、SIGINT、SIGQUIT、SIGTERMのシグナルが送られるとonShutdownを実行します。

trap 'onShutdown' SIGHUP SIGINT SIGQUIT SIGTERM

macOSのシャットダウンア等によりスクリプトの実行プロセスが停止されるまでスクリプトが終了しないようにするための無限ループです。

while true; do
    sleep 86400 & wait $!
done

Comment

スポンサーリンク