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:ユニットファイルの雛形
Description=my service
ExecStart=/absolute/path/to/command
ExecStop=/bin/kill ${MAINPID}
Restart=always
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=... で明示
📖 参考リンク
📁 関連ページ