systemd user service
🤖
📁 概要
systemd の --user モードを使い、一般ユーザー権限でサービスを管理・自動起動する方法についてまとめる。
sudo 不要で、~/.config/systemd/user/ にユニットファイルを置き、systemctl --user で操作する。
🔐 基本構成
📂 ユニットファイルの配置場所
~/.config/systemd/user/<service-name>.service
📋 操作コマンド(全て --user フラグ)
systemctl --user daemon-reload
systemctl --user enable <service>
systemctl --user start <service>
systemctl --user status <service>
systemctl --user stop <service>
systemctl --user restart <service>
📋 ログの確認
journalctl --user -u <service>
📋 自動起動(ログイン前)を有効化
sudo loginctl enable-linger <username>
🔖 ユニットファイルの雛形
code:ユニットファイルの雛形
Unit
Description=my service
Service
ExecStart=/absolute/path/to/command
ExecStop=/bin/kill ${MAINPID}
Restart=always
Install
WantedBy=default.target
📌 ポイント
WantedBy=default.target が必須(--user モードに multi-user.target は存在しない)
ExecStart は絶対パスで書く(ログインシェルの PATH を継承しないため)
After= でシステムユニット(例: mysql.service)を参照できない(systemd --user は systemd --system とは別プロセス)
🔑 自動起動タイミング
デフォルト: 該当ユーザーが最初にログインした時点で起動
ログアウト後もサービスは継続する
システム起動時に自動起動させるには:
sudo loginctl enable-linger <username>
🚧 ハマりどころ
Install を変更したら systemctl --user enable を叩き直す(symlink が再生成される)
systemctl --user daemon-reload が必要な場合もある
symlink が ~/.config/systemd/user/default.target.wants/ になければ動かない
PATH 問題: ログインシェルの rc を読まないので ExecStart は絶対パス or Environment=PATH=... で明示
📖 参考リンク
https://pyopyopyo.hatenablog.com/entry/2021/04/30/233755
https://qiita.com/k0kubun/items/3c94473506e0e370a227
https://zenn.dev/shuichi/articles/linux-systemd-user
https://takuya-1st.hatenablog.jp/entry/2019/08/09/004829
https://zenn.dev/haccht/articles/e6f08dfed26976
https://wiki.archlinux.jp/index.php/Systemd/ユーザー
https://docs.oracle.com/cd/F61088_01/systemd/CreatingasystemdUserBasedService.html
📁 関連ページ
Firecrawl 自動起動 (NixOS)