☀️

[Ubuntu 22.04] systemctl(systemd)でシェルスクリプトを自動実行

2025/01/19に公開

Ubuntu起動時にシェルスクリプトを自動実行する手順の備忘録です。bashシェルを想定しているためzshなどを使用している方は適宜読み替えてください。

手順

1. シェルスクリプトを作成

任意の場所でシェルスクリプトを作成します。

sample.sh
#!/bin/bash

# 例) pythonスクリプトを実行
/home/ubuntu/.pyenv/versions/3.12.7/bin/python3.12 /home/ubuntu/example/main.py
  • ファイルは絶対パスで表記
  • カレントディレクトリを移動する必要がある場合はcd /home/ubuntu... && ...のようにする

実行権限を付与

bash
chmod 744 sample.sh

2. 設定ファイルを作成

サービスのファイルを配置する場所に移動

bash
cd /etc/systemd/system

このディレクトリ内の<service-name>.serviceがすべてサービスとして認識されます。

任意の名称で.serviceファイルを作成

bash
sudo vim sample.service
sample.service
[Unit]
Description=This is sample service  # serviceの説明
After=network.target  # ①

[Service]
User=<User Name>  # 実行するユーザー名
ExecStart=/home/ubuntu/sample.sh  # シェルスクリプトの場所(絶対パス)
Restart=always  # ②
type=simple  # ④

[Install]
WantedBy=multi-user.target

①[Unit] - After

ここで指定したサービスが終了した後にこのサービスを実行します。
network.targetネットワークが利用可能になった後ということです、

②[Service] - Restart

プロセスが停止したときのプロセス再起動の条件です。

  • always: 常に再起動
  • no: 再起動しない
  • on-success: 終了コードが0のときに再起動
  • on-failure: 終了コードが0以外の時に再起動

④[Service] - Type

サービスプロセスの起動完了の判定方法を指定します。

  • simple (default): コマンドを実行したタイミングで起動完了
    (フォアグラウンドで実行を継続するコマンド)
  • forking: 実行したコマンドが終了した時点で起動完了

サービスをリロード

bash
sudo systemctl daemon-reload

自動起動を有効化

bash
sudo systemctl enable sample.service
# sample.serviceは設定ファイル名

サービス起動

bash
sudo systemctl start sample.service

状態確認

bash
sudo systemctl status sample.service


画像のオレンジ枠内のようにActiveになっていれば成功です。

再起動後にもう一度systemctl statusを実行してActiveであることを確認してください。

トラブルシューティング

code=exited, status=203/EXEC

systemctl statusコマンドでは原因がわからないのでおとなしくlogを見ましょう

bash
less /var/log/syslog

たいてい、Permission deniedNo such file or directoryエラーが発生しています。

Permission denied: シェルスクリプトの実行権限を744に指定
No such file or directory: すべて絶対パスで指定しているかもう一度確認

参考文献

https://note.com/ipa713/n/ndf1b4941362d
https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9

GitHubで編集を提案

Discussion