티스토리 뷰

개인 서버라면 root 계정이나 sudo 커맨드를 고민 없이 사용하지만, 실무에서는 서버 관리자가 아니라면 그러기가 쉽지 않다. 그렇다고 매번 서버 관리자에게 작업을 요청할 수 없으니, 유저 권한으로 할 수 있는 것들은 최대한 해야하겠지…🙂‍↕️

 

이번 포스팅에서는 유저 권한으로 서비스를 실행하는 방법과 계정 로그아웃 상황에서도 서비스를 유지하는 방법에 대해 정리해본다.

 

네네, 압니다요

 

 

 

1. 테스트 스크립트 생성

유저 서비스로 등록할 테스트 스크립트(→ 1초 간격으로 현재 시간을 tmp 경로에 남김)는 다음과 같다. 해당 스크립트를 유저의 홈 경로(~/test.sh)에 저장하여 사용할 것이다.

#!/bin/bash

while true; do
  echo `date` >> /tmp/date.log
  sleep 1
done

 

 

스크립트 실행을 위해서 실행 권한도 변경해준다.

$ chmod u+x ~/test.sh

 

 

 

2. 서비스 유닛 파일 생성

유저 레벨의 서비스 유닛 파일 경로는 ~/.config/systemd/user에 저장해서 사용한다. 디렉토리가 없다면 생성해서 서비스 유닛 파일을 저장한다.

$ mkdir -p ~/.config/systemd/user

 

 

서비스 유닛 파일(~/.config/systemd/user/user-test.service)은 이전 단계에서 생성된 파일을 실행하도록 구성했다.

[Unit]
Description=Test User-Level Service

[Service]
ExecStart=/home/foo/test.sh
Restart=always

[Install]
WantedBy=default.target

 

 

 

3. 서비스 실행

이제 추가한 서비스 유닛 파일을 다음 명령어를 통해 로드하고

$ systemctl --user daemon-reload

 

 

서비스를 실행한다!

$ systemctl --user start user-test

 

 

서비스의 상태와 실행 결과를 확인하면 문제 없이 잘 수행되는 것을 알 수 있다.

서비스 상태
의도한대로 1초마다 현재 시간을 잘 찍어준다.

 

 

 

4. 유저 로그아웃에도 서비스 유지하기

여기까지 했으면 유저 권한으로 서비스를 잘 실행했을 수도 있다고 볼 수 있지만, 문제는 유저가 로그아웃을 하게되면 서비스가 멈추게 된다. → 이번 포스팅을 작성한 계기이다.

서비스를 실행한 계정에서 로그아웃을 하면, 서비스가 일정 시간이 지난 후에 멈추는 것을 확인할 수 있다.

 

 

다시 로그인을 한 뒤 서비스 상태를 확인해보면 inactive로 변경된 것을 볼 수 있다.

 

 

서비스를 유저가 로그아웃을 해도 계속 실행되도록 하기 위해서는 아래의 명령어를 사용하면 된다.

$ loginctl enable-linger $USER

 

 

그러면 유저의 Linger 속성이 yes로 변경되고, 유저가 로그아웃을 해도 유저 서비스가 유지된다.

참고로, lingersms 남다/계속되다라는 뜻

 

 

테스트 결과를 살펴보면, 유저가 로그아웃을 해도 서비스가 유지되고 다시 접속해 서비스 상태를 확인해도 active인 것을 알 수 있다.

댓글