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も不要です。
コメント