☀️
[Ubuntu 22.04] systemctl(systemd)でシェルスクリプトを自動実行
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 denied
かNo such file or directory
エラーが発生しています。
Permission denied
: シェルスクリプトの実行権限を744に指定
No such file or directory
: すべて絶対パスで指定しているかもう一度確認
参考文献
Discussion