メインコンテンツへスキップ
見出し画像

【Linux】Systemd メモ

    Linuxでのプログラム自動起動に関するsystemdの使い方メモと、サービスの作成や登録に関する自作スクリプトのまとめです。
    お役に立てば嬉しいです。

    基本のオプション

    systemctl [オプション] [サービス名.service]

    • start
      開始

    • stop
      停止

    • restart
      再起動

    • reload
      再読み込み

    • status
      状態表示

    • enable
      自動起動オン

    • disable
      自動起動オフ

    • is-enable
      自動起動確認

    • daemon-reload
      設定ファイルの再読み込み

    サービス一覧表示

    systemctl list-unit-files --type=service

    自作サービスの作成

    ユニットファイルの作成

    以下はrcatが使用しているテンプレートです。
    ここにサービスに関する情報をいろいろ書くことで、自作のスクリプトなどを起動時に実行できるようになります。
    ちょっとメモしておきますが、もっと細かいことはChatGPTにでも聞くと教えてくれます

    [Unit]
    Description=Rcat999Service
    
    [Service]
    Type=simple
    WorkingDirectory=/myservice
    ExecStart=/bin/sh /myservice/Startup.sh
    StandardOutput=file:/myservice/Startup.log
    
    [Install]
    WantedBy=multi-user.target network-online.target
    • Unit
      概要などを書く

      • description サービスの説明です。

    • Service
      ここで起動するサービス関する設定を行います。

      • Type
        サービスのタイプ、少し種類があるらしいです。

      • WorkingDirectory
        作業ディレクトリ。こういうのやる人なら分かりますよね。

      • ExecStart
        実行文。Shellに入力するのと同じ要領で何をどんな引数を持って実行するかを書いておきます。

      • StandardOutput
        標準出力をテキストに出力する場合は、ここに出力先のパスを書いておきます。

      • User
        User=myuser
        Group=mygroup
        実行するユーザーを指定します。書かなければrootで実行されます。

      • Environment
        Environment=VAR1=value1
        環境変数を設定します。
        例えば$HOMEなどのユーザーの環境変数は使えないことがあるので、経験上設定しておかないと立ち上がらないPythonライブラリなどがあります。(立ち上がらないと思ったら、まさかのHOME変数がありませんというエラーが出てくるという)

    • Install
      起動する条件なんかを書いておきます。

      • WantedBy=multi-user.target network-online.target
        インターネットに接続していないと起動しません

    ユニットファイルの自動作成

    いくらテンプレートを書いていたとしても、何度もやるかつ回数は多くないので結構忘れるのでスクリプトにしちゃいました。
    具体的には実行するシェルスクリプトを作成しておき、それを起動するためのサービスを自動的に作成するという形です。

    rcat@rcat-Green-G5:/Rcat_Service/Script/gameserver2/bot$ CreateService-sh
    ###サービス作成###
    
    操作を選択
    [1] 新規作成
    [2] 既存のサービスファイルから作成
    
    ※本スクリプトはroot権限で実行してください
    
    実行するSHスクリプトは?
    フルパスで入力してください
    
    このディレクトリにある以下を使う場合は空欄
    /Rcat_Service/Script/gameserver2/bot/start.sh
    
    引数があれば入力
    
    サービス名は?
    ファイル名と同じ場合は空欄
    ※英数字のみ
    R_GameBOT
    ネットワークがオンラインであることを条件とする
    (y/n)
    y
    標準出力をログに出力しますか?
    (y/n)
    y
    
    
    以下の内容で作成します
    
    --------------------------------------------
    [Unit]
    Description=R_GameBOT
    After=network-online.target
    
    [Service]
    User=rcat
    Type=simple
    WorkingDirectory=/Rcat_Service/Script/gameserver2/bot
    ExecStart=/Rcat_Service/Script/gameserver2/bot/start.sh
    StandardOutput=file:/Rcat_Service/Script/gameserver2/bot/log.log
    
    [Install]
    WantedBy=multi-user.target network-online.target
    
    --------------------------------------------
    (y/n)

    例えばこの例では以下しか入力していません。
    1,Enter,Enter,R_GameBOT,y,y,y
    はい、とても簡単です。これだけでユニットファイルが作成できます。

    サービスの追加

    出来上がったものは2つ目のスクリプトServeceAddを使って追加します。
    中身はこんな感じになっていて、etcにコピーするだけですね。

    画像

    スクリプト配布

    上で紹介したサービスを作成するスクリプトと追加するスクリプトおよび削除するスクリプトを配布します。
    内容は以下の通りです。

    画像

    このスクリプトを起動する際は、以下のような形でエイリアスに事前に入れておくと使いやすいです。
    入れたくない場合はコマンドの部分だけ入力して使ってください。

    画像

    配布URL

    下記からダウンロードできます。
    利用規約に同意の上、ご利用ください。

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=Linux_サービス系


     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ