【Linux】起動時にスクリプトを自動実行させるには?(最新版)

Linux

Linuxの起動時にスクリプトを自動実行させる方法をご紹介します。

スポンサーリンク

systemdを使うのがおすすめ!

Systemdを使う(サービスに登録して自動実行させる)のが確実です!

  • crontabに@rebootを指定する方法
  • /etc/rc.localにコマンドを指定する方法

などなどいろいろありますが、どれも古いやり方だったりします。サービスを作成して自動実行させるのが推奨のやり方みたいです。

スポンサーリンク

起動時にスクリプトを自動実行させるには?

さっそくやり方をご紹介します。まずはサービスファイルを作成します。

sudo nano /etc/systemd/system/myscript.service

[Unit]
Description=My Custom Script
After=network.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/root/init-script.sh #スクリプトのパスを指定する

[Install]
WantedBy=multi-user.target

作成したサービスの自動起動を有効にします。

sudo systemctl enable myscript.service

あとはLinuxを再起動させると、自動で実行されます。

スクリプトを作るときに注意すること

パーミッションを適切に設定しておこう

rootユーザーの実行権忘れずに設定しましょう。

#chmod u+x /root/init-script.sh

Shebangを明示しよう

また、スクリプトにはシェルを明示することが必要です。

#!/bin/bash
echo "HELLO"

#!/bin/bashの部分を明示しないと、以下のようなエラーが発生して実行されません。ご注意ください。

Failed to execute /root/init-script.sh: Exec format error

【解説】サービスファイルの作り方

起動時にスクリプトを実行させるサービスファイルについて補足しておきます。

sudo nano /etc/systemd/system/myscript.service

[Unit]
Description=My Custom Script
After=network.service #これはネットワーク接続が確立してから実行させるという意味

[Service]
Type=oneshot #なんでもいいからスクリプトを実行させるモードにする
RemainAfterExit=yes #スクリプトの実行が終わったら、Active状態ってことにする
ExecStart=/path/to/your/script.sh #スクリプトのパスを指定する

[Install]
WantedBy=multi-user.target

コメントの通りです。

After=network.serviceは基本的に指定することをおすすめします。指定しないと、ネットワークに関わるコマンドがうまく動作してくれないことがあります。

動かないときは?

今すぐ実行するには以下のコマンドを実行します。

sudo systemctl start myscript.service

動かないときはログを確認します。

journalctl -xe

上記コマンドを実行するとログが表示されます。

指定したスクリプトはバックグラウンドで実行されます。

バックグラウンドで実行させるときの&は不要です。またnohupも不要です。

コメント

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