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つ、自動化の設定をしてみてください。 きっと「もっと早くやっておけばよかった」と思うはずですよ!
自動化は、エンジニアの強い味方です。 面倒な作業はコンピューターに任せて、もっとクリエイティブな仕事に時間を使いましょう!
コメント