1. 概要

この短いチュートリアルでは、Linuxでの起動時にスクリプトを実行するためのさまざまなオプションについて説明します。 これは、サーバーアプリケーションを自動的に起動する場合など、さまざまな状況で役立ちます。

2. ソリューション

さらに面倒なことはせずに、実行する簡単なスクリプトを作成しましょう。

#!/bin/sh
echo "Last reboot time: $(date)" > /etc/motd

このコードは、その日のメッセージを最後の再起動時刻に設定して、各ユーザーが最初のログイン後にメッセージを表示できるようにします。

その後、ファイルを保存して実行可能にします。

$ chmod +x reboot_message.sh

スクリプトの準備ができたので、実行をスケジュールする方法を見てみましょう。

2.1. cronを使用する

cronを使用する最も簡単なソリューションから始めましょう。 そのためには、crontabファイルを編集する必要があります。

$ crontab -e

ここでは、 @reboot 式を使用して行を追加します。これにより、起動時にコードが1回実行されます。

@reboot sh /home/ec2-user/reboot_message.sh

追加の構成を処理する必要がないため、このソリューションは迅速でクリーンですが、cronのすべてのバージョンが@rebootをサポートしているわけではありません。

2.2. rc.localを使用する

次に、/etc/rc.d/rc.localファイルを利用する別のソリューションについて考えてみましょう。 このファイルは起動時にすでに実行されているため、スクリプトを呼び出す行を追加できます。

sh /home/ec2-user/reboot_message.sh

ただし、これを機能させるには、rc.localファイル自体が実行可能であることを確認する必要があります

$ chmod +x /etc/rc.d/rc.local

2.3. init.dを使用する

前のソリューションと同様に、 /etc/init.dフォルダーには、システムによって管理されるサービスのライフサイクル実行可能ファイルが含まれています。 さらに、サービスを開始するLSB準拠のラッパーを作成することで独自のラッパーを追加できます。

#! /bin/sh
# chkconfig: 345 99 10
case "$1" in
  start)
    # Executes our script
    sudo sh /home/ec2-user/reboot_message.sh
    ;;
  *)
    ;;
esac
exit 0

このラッパーは、start引数で呼び出されたときにコードを起動します。 ただし、サービスのランレベルと開始/停止の優先度を含むchkconfig構成の行を含める必要があります。

ラッパーをinit.dフォルダーに配置した後、スタートアップを実行するためにサービスを登録する必要があります。

$ chkconfig --add service_wrapper.sh

chkconfig コマンドはDebianシステムでは使用できないため、update-rc.dを代わりに使用できます。

$ update-rc.d service_wrapper.sh defaults

2.4. systemdを使用する

最後に、systemdでスクリプトを実行する方法を見ていきます。 init.d と同様に、 / etc / systemd /systemの下にユニットファイルと呼ばれるサービス記述子を作成する必要があります。

[Unit]
Description=Reboot message systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /home/ec2-user/reboot_message.sh

[Install]
WantedBy=multi-user.target

ファイルはさまざまなセクションに編成されています。

  • Unit –人間が読める形式の説明などの一般的なメタデータが含まれています
  • Service –サービスを開始するコマンドとともに、プロセスとデーモン化の動作について説明します
  • Install WantedBy で指定されたフォルダーを使用して依存関係を処理し、起動時にサービスを実行できるようにします

最後に、ファイルのアクセス許可を644に設定し、systemctlを使用してサービスを有効にする必要があります。

$ chmod 644 /etc/systemd/system/reboot_message.service
$ systemctl enable reboot_message.service

覚えておくべきことの1つは、多くの主要なディストリビューションが systemd をサポートしていますが、常に利用できるとは限らないということです。

3. 結論

この記事では、Linuxの起動時にスクリプトを実行するさまざまな方法について説明しました。 それぞれに長所と短所がありますが、一般的に言えば、systemdcronが利用可能な場合は優先されます。 一方、rc.localおよびinit.dはフォールバックとして使用できます。