Linux起動時にコマンドを自動実行!5つの方法を完全マスター

Linux

Linuxサーバーを再起動するたびに、同じコマンドを手動で実行していませんか?

「Webサーバーを起動して、データベースを立ち上げて、監視ツールを動かして…」 毎回これをやるのは、正直めんどうですよね。

実は、これらのコマンドをLinuxの起動時に自動で実行させる方法があるんです。 一度設定すれば、あとは勝手に動いてくれます。

この記事では、初心者の方でも簡単にできる自動実行の設定方法を、5つのパターンに分けて詳しく説明します。 あなたの用途に合った方法が、きっと見つかりますよ!

スポンサーリンク

なぜ起動時の自動実行が必要なの?

サーバー管理が楽になる

深夜にサーバーが再起動しても、自動で必要なサービスが立ち上がります。

緊急対応で慌てることもなくなりますし、休日に呼び出される心配も減ります。 これだけでも、設定する価値は十分にありますよね。

ヒューマンエラーを防げる

手動でコマンドを実行すると、どうしてもミスが起きます。

  • コマンドの打ち間違い
  • 実行順序の間違い
  • そもそも実行を忘れる

自動化すれば、これらのミスから解放されます。

複数のサーバーを効率的に管理

10台、20台とサーバーが増えても、同じ設定をコピーするだけでOK。

手動で全部設定していたら、丸一日かかってしまいます。 自動化の仕組みを作れば、スケーラブルな運用が可能になるんです。

方法1:systemd(最新のLinuxならコレ!)

systemdって何?

systemd(システムディー)は、最近のLinuxで標準的に使われている、サービス管理の仕組みです。

Ubuntu 16.04以降、CentOS 7以降、Debian 8以降なら、これが使えます。 一番確実で、管理もしやすい方法なんです。

基本的な設定手順

ステップ1:サービスファイルを作成

まず、自動実行したいコマンドを登録するファイルを作ります。

sudo nano /etc/systemd/system/my-startup-script.service

ステップ2:設定を記述

ファイルに以下の内容を書きます:

[Unit]
Description=起動時に実行する私のスクリプト
After=network.target

[Service]
Type=simple
ExecStart=/home/user/scripts/startup.sh
Restart=on-failure
User=username

[Install]
WantedBy=multi-user.target

各項目の意味:

  • Description:このサービスの説明(自由に書けます)
  • After:ネットワークが使える状態になってから実行
  • ExecStart:実行したいコマンドやスクリプトのパス
  • User:どのユーザー権限で実行するか

ステップ3:サービスを有効化

sudo systemctl daemon-reload
sudo systemctl enable my-startup-script.service
sudo systemctl start my-startup-script.service

これで設定完了!次回の起動時から自動実行されます。

状態確認とトラブルシューティング

サービスの状態を確認:

sudo systemctl status my-startup-script.service

うまく動かない時のログ確認:

sudo journalctl -u my-startup-script.service

方法2:crontabの@reboot(手軽に設定したいならコレ)

crontabの特殊な使い方

crontab(クロンタブ)は本来、定期実行のためのツールですが、起動時実行もできるんです。

@rebootという特殊な指定を使うと、システム起動時にコマンドを実行できます。 設定が簡単なので、ちょっとしたスクリプトならこれで十分です。

設定方法

ユーザーのcrontabに追加:

crontab -e

以下の行を追加:

@reboot /home/user/scripts/startup.sh
@reboot sleep 30 && /usr/bin/python3 /home/user/monitor.py

2行目のように、sleepコマンドで起動を遅らせることもできます。 ネットワークが完全に立ち上がるのを待つ時などに便利ですよ。

メリットとデメリット

メリット:

  • 設定が簡単
  • ユーザー権限で実行できる
  • 既存のcrontab知識が活かせる

デメリット:

  • 実行順序の細かい制御ができない
  • エラー処理が弱い
  • ログの管理が面倒

方法3:rc.local(古いけど使えるシステムも多い)

rc.localとは

昔からあるシンプルな方法です。

/etc/rc.localファイルに書いたコマンドが、起動時に実行されます。 古いシステムでも動くので、レガシーシステムの管理には重宝します。

設定手順

ステップ1:rc.localファイルを編集

sudo nano /etc/rc.local

ステップ2:コマンドを追加

#!/bin/bash
# 起動時に実行したいコマンドをここに書く

# Webサーバーの起動
/usr/local/bin/start-web-server.sh

# 監視ツールの起動
/home/admin/monitoring/start.sh &

# 最後は必ずexit 0で終わる
exit 0

重要なポイント:

  • コマンドの最後に「&」を付けると、バックグラウンドで実行
  • 必ず最後に「exit 0」を書く
  • 実行権限を忘れずに付ける

ステップ3:実行権限を付与

sudo chmod +x /etc/rc.local

注意点

最新のLinuxディストリビューションでは、rc.localがデフォルトで無効になっていることがあります。

その場合は、systemdでrc-local.serviceを有効にする必要があります:

sudo systemctl enable rc-local.service

方法4:init.dスクリプト(本格的なサービスを作るなら)

プロ仕様のサービス管理

/etc/init.d/にスクリプトを配置する方法は、本格的なサービスを作る時に使います。

start、stop、restart などのコマンドに対応した、しっかりしたサービスが作れます。 ちょっと難しいですが、覚えておくと役立ちますよ。

スクリプトの作成例

sudo nano /etc/init.d/myservice

基本的な構造:

#!/bin/bash

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: 私のカスタムサービス
### END INIT INFO

case "$1" in
  start)
    echo "サービスを開始します..."
    # ここに起動コマンドを書く
    /usr/local/bin/myapp start
    ;;
  stop)
    echo "サービスを停止します..."
    # ここに停止コマンドを書く
    /usr/local/bin/myapp stop
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
    echo "使い方: $0 {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

登録と有効化

# 実行権限を付与
sudo chmod +x /etc/init.d/myservice

# システムに登録
sudo update-rc.d myservice defaults

# サービスの開始
sudo service myservice start

方法5:.bashrcや.profileを使う(ユーザーログイン時)

ログイン時の自動実行

厳密には「システム起動時」ではなく「ユーザーログイン時」ですが、これも便利な方法です。

開発環境の準備や、個人用ツールの起動などに向いています。

設定方法

.bashrcに追加する場合:

nano ~/.bashrc

ファイルの最後に追加:

# ログイン時の自動実行
echo "ようこそ!環境を準備しています..."

# 開発用データベースの起動
if ! pgrep -x "mysqld" > /dev/null; then
    echo "MySQLを起動します..."
    sudo service mysql start
fi

# 仮想環境の有効化
if [ -d ~/myproject/venv ]; then
    source ~/myproject/venv/bin/activate
    echo "Python仮想環境を有効化しました"
fi

# エイリアスの設定
alias ll='ls -la'
alias gs='git status'

.profileとの使い分け

  • .bashrc:bashシェルを起動するたびに実行
  • .profile:ログイン時に1回だけ実行

重い処理や1回だけ実行したいものは.profileに書きましょう。

トラブルシューティング:よくある問題と解決法

コマンドが実行されない

原因1:パスが通っていない

起動時は環境変数PATHが限定的なので、フルパスで指定しましょう。

悪い例:

python3 script.py

良い例:

/usr/bin/python3 /home/user/script.py

原因2:ネットワークがまだ使えない

ネットワークを使うコマンドは、少し待ってから実行:

sleep 30 && your_command

権限エラーが出る

解決策:適切なユーザーで実行

systemdなら:

[Service]
User=appropriate_user
Group=appropriate_group

crontabなら、そのユーザーのcrontabに登録:

sudo -u username crontab -e

ログが見つからない

各方法でのログ確認場所:

  • systemd:journalctl -u service_name
  • crontab:/var/log/syslog または /var/log/cron
  • rc.local:/var/log/boot.log
  • init.d:/var/log/syslog

セキュリティの注意点

パスワードを直接書かない

スクリプトにパスワードを直接書くのは危険です。

代わりに:

  • 環境変数を使う
  • 設定ファイルを別に用意(権限を600に)
  • 鍵認証を使う

最小権限の原則

rootで実行する必要がないなら、一般ユーザーで実行しましょう。

必要な権限だけを与えることで、セキュリティリスクを減らせます。

スクリプトの配置場所

重要なスクリプトは、一般ユーザーが書き換えられない場所に置きましょう。

推奨される場所:

  • /usr/local/bin/
  • /opt/scripts/
  • /root/scripts/(rootのみ実行する場合)

実践例:Webアプリケーションの自動起動

Node.jsアプリの場合

systemdサービスファイルの例:

[Unit]
Description=Node.js App
After=network.target

[Service]
Type=simple
User=nodejs
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/server.js
Restart=on-failure
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

Dockerコンテナの場合

docker-composeを使った自動起動:

# systemdサービスファイル
[Unit]
Description=Docker Compose Application
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

まとめ:あなたに最適な方法を選ぼう

Linux起動時の自動実行には、様々な方法があります。

選び方の指針:

  • 最新のLinuxを使っている → systemdがおすすめ
  • 簡単に設定したい → crontabの@reboot
  • 古いシステムも対応したい → rc.local
  • 本格的なサービスを作る → init.dスクリプト
  • 個人用の環境設定 → .bashrcや.profile

最初は簡単な方法から始めて、徐々に高度な方法にチャレンジしていくのがいいでしょう。

一度設定してしまえば、サーバー管理が劇的に楽になります。 深夜の緊急対応も減りますし、ミスも防げます。

この記事を参考に、まずは1つ、自動化の設定をしてみてください。 きっと「もっと早くやっておけばよかった」と思うはずですよ!

自動化は、エンジニアの強い味方です。 面倒な作業はコンピューターに任せて、もっとクリエイティブな仕事に時間を使いましょう!

コメント

タイトルとURLをコピーしました