systemd service하면 보통 root로 돌아가는 서비스를 생각하기 마련인데 이는 사용자 수준에서도 동작한다.
이 문서에는 service 작성에 대한 이야기보다는 사용자 수준에서의 systemd service 등록에 대한 기록을 남겨보려 한다.
Service 등록
우선 단순히 말하자면 사용자 수준에서의 systemd service는 루트에서의 systemd service 명령어에 –user 옵션을 붙여주기만 하면 된다.
$ systemctl --user deamon-reload # Service 파일 동기화 $ systemctl --user enable something.service # 부팅 시 실행 $ systemctl --user start something.service # Service 시작 $ systemctl --user restart something.service # Service 재시작 $ systemctl --user stop something.service # Service 종료 $ systemctl --user status something.service # Service 상태 확인
root가 실행하는 service는 /etc/systemd/system에 등록되어 운영되나, 사용자가 실행하는 service는 사용자의 홈 경로(~/.config/systemd/user)에 등록되어 운영된다.
그러므로 해당 경로에 service를 넣고 daemon-reload를 통해 로드해주면 바로 service를 사용할 수 있다.
로그아웃 시 Service 유지
다만 한 가지 문제가 있다면 systemd 사용자 인스턴스는 사용자 세션이 시작될 때 함께 시작되며 세션이 종료될 때 함께 종료된다는 점이다. [archwiki]
이 방식은 서비스를 부팅시 실행하고 시스템 종료와 함께 종료시키고 싶을 때에는 적합하지 않다.
이를 해결하는 가장 좋은 방법은 [archwiki]에서 소개하는 loginctl 명령어를 사용하는 방법으로 보인다.
loginctl은 systemd 사용자 매니저를 사용하기 위한 프로그램이다. [ubuntu]
enable-linger 옵션을 주어 loginctl을 실행하면 로그아웃 후에도 해당 유저의 service가 살아있게 된다.
enable-linger [USER...], disable-linger [USER...] Enable/disable user lingering for one or more users. If enabled for a specific user, a user manager is spawned for the user at boot and kept around after logouts. This allows users who are not logged in to run long-running services. Takes one or more user names or numeric UIDs as argument. If no argument is specified, enables/disables lingering for the user of the session of the caller.
다행히도 loginctl은 루트 권한없이 사용자 수준에서 실행할 수 있는 명령어이다.
다음 명령어를 실행하여 service를 특정 사용자에게 lingering시킬 수 있다.
$ loginctl enable-linger username