ubuntu起動時にpythonプログラム実行
背景
コスト節約のために毎晩クラウド上のUbuntuサーバーをシャットダウンし、毎朝起動することにしました。
起動後、pythonプログラムを実行する必要がありましたが、手動実行するのは面倒なため起動時に自動実行するように設定してみました。
環境
Ubuntu 22.04
やり方
systemdを設定します。
設定ファイルの格納先に移動します。
$cd /etc/systemd/system
任意の名称で.serviceファイルを作ります。
$vi run_python.service
以下の設定をします。
[Unit]
Description=python run
After=network.target
[Service]
User=#ユーザー名#
ExecStart=#PYTHON_ENV#/bin/python3 sample.py
Restart=always
type=simple
[Install]
WantedBy=multi-user.target
[Unit] セクション
Description: このサービスの説明です。好きな名称でOK。
After=network.target: このサービスがnetwork.target後に起動することを指定します。つまり、ネットワークが利用可能になった後でサービスが開始されます。
[Service] セクション
User=#ユーザー名#: このサービスを実行するユーザーを指定します。
ExecStart=#PYTHON_ENV#/bin/python3 sample.py: サービス開始時に実行されるコマンドを指定します。私の場合、pyenvとpyenv-virtualen vを使用して実行しているため、実行のために使用するbinファイルを絶対パスで指定しています。実行するpythonファイルも絶対パスで指定しています。
Restart=always: サービスが停止した場合、自動的に再起動することを指定します。
type=simple: サービスの種類を指定します。simpleは、ExecStartで指定したプロセスがフォアグラウンドで動作する(※1)ことを意味します。
[Install] セクション
WantedBy=multi-user.target: サービスが有効になった場合、multi-user.targetに依存することを指定します。multi-user.targetは、通常のマルチユーザーモード(※2)での動作を意味します。
編集が完了したら、サービスをリロードします。
$sudo systemctl daemon-reload
サービスを有効にして、自動起動を設定します
$sudo systemctl enable run_python.service
サービスを開始します
$sudo systemctl start run_python.service
問題なく起動できているかは以下で確認します
$sudo systemctl status run_python.service
まとめ
地味だがこれで余計な時間を掛けずに済みます。起動したいプログラムが多数あるならシェルスクリプトでまとめて実行してもいいかもしれません。
(※1)フォアグラウンドで動作するとは
プログラムやサービスが直接ターミナルやシェルの制御下にあり、その出力やエラーが即座に表示される状態を指します。以下はその具体的な特徴です:
直接制御:ユーザーがプログラムを起動したターミナルやシェルで、プログラムが直接実行される。
出力表示:プログラムの出力(標準出力および標準エラー出力)がリアルタイムで表示される。
シグナル受信:ユーザーがCtrl+Cなどのシグナルを送信することで、プログラムを停止させることができる。
(※2)マルチユーザーモードとは
複数のユーザーが同時にシステムにログインして操作できるモード。Linuxのシステムモードのひとつで、システムがどのような状態で動作するのかを定義する。
主要なシステムモード(ターゲット)
救援モード(rescue.target)
シングルユーザーモード(single-user.target)
マルチユーザーモード(multi-user.target)
グラフィカルモード(graphical.target)