티스토리 뷰

728x90

[상황]
jar 파일을 실행시키는 start.sh 파일을 생성하여 service 등록을 하였는데, 정상적으로 동작하지 않는 기능이 생겼다.

 

>> 서비스 등록 방법은 아래 글에 있습니다!

https://yes-admit.tistory.com/57

 

[CentOs] 서비스 등록으로 서버 재부팅시 자동으로 프로그램 실행시키기

테스트 중 서버를 자주 내렸다 올렸다 하는 경우가 생겼는데 그 때마다 서비스를 새로 올려줘야해서 불편했다. 하나만 올리는거라면 그나마 괜찮겠지만 나는 2개나 올려야 해서...너무 귀찮았다

yes-admit.tistory.com

 

환경변수의 문제였는데 해당 기능이 정상적으로 동작 하기 위한 환경변수가 특정 사용자에게만 부여가 되어있기 때문이었다. 따라서 정상 실행을 위해서는 해당 사용자로 실행을 해야했다. (라고 생각했다)

service 등록 시 사용자를 지정 할 수 있기에 사용자와 그룹을 아래와 같이 지정하고 재시작하였다.
(그룹은 생략 가능, 생략한 경우에는 지정한 사용자의 그룹이 사용된다)

[Unit]
Description=test Service #서비스 설명
After=network.target 

[Service]
User=my_user  # 사용자 지정
Group=my_group  # 그룹도 지정(지정하지 않는 경우 User에 지정한 사용자의 그룹을 사용)
Type=forking
Restart=always
RestartSec=1
SuccessExitStatus=143
ExecStart=/usr/local/test.sh #실행 시킬 명령어

[Install]
WantedBy=multi-user.target

 

서비스 데몬을 reload하고 systemctl로 재시작을 하였다. 프로세스도 지정한 사용자명으로 실행 된 것을 확인! 그러나 기능이 정상적으로 동작하지 않았다ㅜㅜ

 

왜일까..?

 

로그인 셸에서 사용되는 환경 변수와는 달리, systemd는 서비스 프로세스를 사용자가 로그인 하지 않은 상태에서 시작하기 때문에(

비인터랙티브한 환경) 사용자의 환경 설정 파일인 .bashrc, .profile 등이 적용되지 않는다.

서비스가 실행 될 때 사용 되는 환경 변수는 아래와 같다.

 

  1. 서비스 관리자의 전역적으로 구성된 환경 변수 — systemd-system.conf(5)의 DefaultEnvironment= 설정, 커널 명령 줄 옵션 systemd.setenv= (systemd(1)에서 인식), 또는 systemctl(1)의 set-environment 명령어를 통해 설정된 변수들.
  2. 서비스 관리자 자체에 의해 정의된 변수들 
  3. 서비스 관리자의 자체 환경 변수 블록에 설정된 변수들 (시스템 서비스 관리자에서는 PassEnvironment=에 따라 다름).
  4. 유닛 파일의 Environment=를 통해 설정된 변수들.
  5. 유닛 파일의 EnvironmentFile=에서 지정된 파일에서 읽어들인 변수들.
  6. PAMName=이 적용될 경우 PAM 모듈에서 설정된 변수들 (예: pam_env(8) 참조).

따라서 나는 unit파일에 환경변수를 지정해주었다.

[Unit]
Description=test Service #서비스 설명
After=network.target 

[Service]
Environment=환경변수
User=my_user  # 사용자 지정
Group=my_group  # 그룹도 지정(지정하지 않는 경우 User에 지정한 사용자의 그룹을 사용)
Type=forking
Restart=always
RestartSec=1
SuccessExitStatus=143
ExecStart=/usr/local/test.sh #실행 시킬 명령어

[Install]
WantedBy=multi-user.target

 

환경변수를 설정해주니..서비스의 특정 기능이 정상적으로 돌아가는 것을 확인했다..!

사실 해결은 했지만 원인이 아직 정확히 이해가 가는 것은 아니다..(그럼  user를 지정하는건 왜 있는거지..) 언젠가는 이해 할 수 있는 날이 오겠지...

 

 

[참고]

https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html

 

systemd.exec

Takes a boolean argument or the special values "full" or "strict". If true, mounts the /usr/ and the boot loader directories (/boot and /efi) read-only for processes invoked by this unit. If set to "full", the /etc/ directory is mounted read-only, too. If

www.freedesktop.org

https://askubuntu.com/questions/1161901/systemctl-service-cant-read-the-environment-variable

 

systemctl .service can't read the environment variable

I'm using django and now trying to configure server with nginx and uwsi. now i'm running nginx+socket+uwsgi_emperor well . for running uwsgi i use below command in terminal: /usr/local/bin/uwsgi --

askubuntu.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함