📑

systemdで自作サービスを作る時の為のメモ

4 min read

ちょっとしたサービスを登録したい時にいつも忘れるので備忘録残します。

サービスファイルを作る

よくviとかで/etc/systemd/system/配下にxxxx.serviceファイル作る例を見ますがsystemctl editに--force --fullオプションつければファイル作ってくれるので便利です

# systemctl edit --force --full sample.service

老化した脳にはパスを記憶する空き容量すら無いです

ちなみにaptとかでインストールされるサービスを弄りたい時は直接サービスファイルを弄るとupdateで上書きされて悲惨な目にあいます
そういう時は
systemctl edit いじりたいサービス
で実行すると上書き用のファイルを作成出来るのでそこに差分だけ書いておけばいい感じにマージして実行してくれるようになります

こんな感じでサービスファイル作ればOK

[Unit]
Description = sample daemon

[Service]
Type = simple
ExecStart = bash -c 'while sleep 1; do date > /tmp/lastexec; done'
Restart = always

[Install]
WantedBy = multi-user.target

毎秒/tmp/lastexecに実行した時間が出るだけの意味のないサービス

作成したサービスの確認

ちゃんとsystemdに認識されてるか確認します

# systemctl status sample.service
● sample.service - sample daemon
     Loaded: loaded (/etc/systemd/system/sample.service; disabled; vendor preset: enabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: inactive (dead)

起動確認

とりあえず起動してみて問題ないか確認

# systemctl start sample.service
# systemctl status sample.service
● sample.service - sample daemon
     Loaded: loaded (/etc/systemd/system/sample.service; disabled; vendor preset: enabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: active (running) since Wed 2021-08-25 07:00:20 UTC; 1min 8s ago
   Main PID: 10866 (bash)
      Tasks: 2 (limit: 28715)
     Memory: 2.1M
     CGroup: /system.slice/sample.service
             ├─10866 /usr/bin/bash -c while sleep 1; do date > /tmp/lastexec; done
             └─11011 sleep 1

Aug 25 07:00:20 test systemd[1]: Started sample daemon.

問題がありそうならログ確認

# journalctl -eu sample.service
-- Logs begin at Wed 2021-08-25 05:06:13 UTC, end at Wed 2021-08-25 07:04:55 UTC. --
Aug 25 07:00:20 test systemd[1]: Started sample daemon.
Aug 25 07:04:55 test systemd[1]: sample.service: Main process exited, code=killed, status=9/KILL
Aug 25 07:04:55 test systemd[1]: sample.service: Failed with result 'signal'.
Aug 25 07:04:55 test systemd[1]: sample.service: Scheduled restart job, restart counter is at 1.
Aug 25 07:04:55 test systemd[1]: Stopped sample daemon.
Aug 25 07:04:55 test systemd[1]: Started sample daemon

確認のためkillでbashのプロセス落として出したログ

サービスの有効化

特に問題がなければ有効化して再起動しても動くようにする

# systemctl enable sample.service
# systemctl status sample.service
● sample.service - sample daemon
     Loaded: loaded (/etc/systemd/system/sample.service; enabled; vendor preset: enabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: active (running) since Wed 2021-08-25 07:04:55 UTC; 5min ago
   Main PID: 11429 (bash)
      Tasks: 2 (limit: 28715)
     Memory: 2.3M
     CGroup: /system.slice/sample.service
             ├─11429 /usr/bin/bash -c while sleep 1; do date > /tmp/lastexec; done
             └─12259 sleep 1

Aug 25 07:04:55 test systemd[1]: Started sample daemon.

終わり

この作業ってそんなに難しいことしてないのに作業の発生頻度が低すぎて無手の状態からやろうと思うといつも調べ直す羽目になってるので自分の中で一番シンプルなサービスを登録する手順を書いて残しておきました

systemctlとsysctlコマンドどっちがどっちだっけとか。
Serviceセクションに書く内容多すぎてどれ使うんだっけとか。。
journalctlコマンドとか使う頻度低すぎてコマンドの1文字目すら思い出せない。。。

それでは良いLinuxライフをー

しゃみしゃっきりー

P.S.

本文と直接関係はないのですが
この記事書いてる時にサービスファイルをini形式のコードブロックで記載したんですがプレビュー時にセクション名が表示されなくなってしまいました

記事を公開した時には表示されてるのでプレビューに何か問題がありそうな気がします

プレビュー時の見え方

Imgur

公開した時の見え方

[Unit]
Description = sample daemon

[Service]
Type = simple
ExecStart = bash -c 'while sleep 1; do date > /tmp/lastexec; done'
Restart = always

[Install]
WantedBy = multi-user.target

Discussion

ログインするとコメントできます