.INI파일 구문 기본 사항

.INI파일 구문 기본 사항

귀하의 게시물을 기반으로 단위 파일을 수정했습니다.

[Unit]
Description=My Portal Service
After=network.target

[Service]
SyslogIdentifier=my-portal
Environment=SERVICE_NAME=my-portal
Environment=PATH_TO_TARGET=/opt/apps/egp/stage/my-portal/target
ExecStart=/usr/bin/env java -jar ${PATH_TO_TARGET}/${SERVICE_NAME}.jar server ${PATH_TO_TARGET}/${SERVICE_NAME}.yml

[Install]
WantedBy=multi-user.target

또한 다음 명령을 실행합니다.

systemctl daemon-reload

systemd 관리자 구성을 다시 로드합니다.

모든 것이 잘 작동합니다. 다음을 사용하여 서비스를 성공적으로 시작, 중지하고 상태를 볼 수 있습니다.

 systemctl start my-portal
 systemctl status my-portal -l
 systemctl stop my-portal

Java 환경 변수 문제를 해결한 후 다음 명령을 실행합니다.

systemctl enable service-name

부팅 시 서비스를 시작합니다(서비스 - 총 5개).

내가 겪고 있는 문제는 Java 환경 변수를 설정하는 것입니다. 다양한 버전을 시도했습니다. .bash_profile에 추가하고 source 명령을 사용한 다음 /etc/profile.d 폴더의 별도 javaenv.sh 파일에 Java 환경을 작성했습니다.

export JAVA_HOME=/opt/jdk1.7.0_80
export PATH=/opt/jdk1.7.0_80/bin:$PATH

권한 부여:

chmod +x /etc/profile.d/javaenv.sh

ExecStart 줄에 ${JAVA_HOME}/bin을 추가하도록 단위 파일을 수정했습니다. Java를 찾지 못했습니다. 이전에도 같은 문제가 있었는데, sh 스크립트를 사용할 때 오류가 발생했습니다.

nohup: failed to run command ‘java’: No such file or directory  

이 문제에 대해 많이 읽었지만 Java 변수를 한 곳에서 설정하고 이를 다른 유닛이나 스크립트 파일에서 ${JAVA_HOME} 변수로 사용하는 솔루션을 찾을 수 없었습니다.

로깅 없이 어디서나 영구적으로 사용할 수 있도록 Java 환경 변수를 설정하는 위치는 어디입니까?

답변1

.INI파일 구문 기본 사항

[단위]
설명 = 내 포털 서비스
network.target = my-portal.service 이후

이 섹션에서 Unit키는 After, 값은 이어야 합니다(예: ) network.target my-portal.service. 키 After network.target와 값이 있습니다 my-portal.service. 메시지에서 알 수 있듯이 이 키는 systemd에 아무런 의미가 없습니다.

철저한 시스템화공포의 집물건

서비스를 시작하는 것 자체가 말도 안되는 일입니다. 그러나 이것은 빙산의 일각에 불과합니다.

유형=포크
ExecStart = /usr/local/bin/my-portal.sh 시작
ExecStop = /usr/local/bin/my-portal.sh 중지
ExecReload = /usr/local/bin/my-portal.sh 다시 로드
PATH_TO_LOG="/var/log/egp"
PID_PATH_NAME=/var/run/${SERVICE_NAME}-pid
안돼 ... >> ${PATH_TO_LOG}/${SERVICE_NAME}.out 2>&1&

이 모든 것은 이상하게도 Java에서 지배적인 전형적인 패턴으로, 완전히 불필요하고 잘못된 스캐폴딩을 만들어 어리석게 만듭니다.

쉘 스크립트가 필요하지 않습니다별말씀을요. 사용하려고 시도하는 불안정하고 위험한 PID 파일 메커니즘은 확실히 필요하지 않습니다. 또한 불안정한 logrotate/newsyslog 메커니즘에 의존하는 수동 로깅 메커니즘이 필요하지 않으며 디스크 볼륨이 로그 출력(슈퍼유저 권한이 있는 프로세스에 의해 작성되므로 로그 출력으로 가득 차는 것을 방지할 방법이 없습니다. 수퍼유저 - 대부분의 경우 응급 디스크 공간을 예약합니다.

기존 서비스 관리자 기능을 사용합니다.

#/etc/systemd/system/my-portal.service
[단위]
설명=myportalservice
문서=https://unix.stackexchange.com/a/434726/5132
이후 = network.target

[제공하다]
SyslogIdentifier=MyService
환경=SERVICE_NAME=내 서비스
환경 = PATH_TO_TARGET="/opt/apps/egp/stage/my-service/target"
ExecStart=/usr/bin/env java -jar ${PATH_TO_TARGET}/${SERVICE_NAME}.jar 서버 ${PATH_TO_TARGET}/${SERVICE_NAME}.yml

[설치하다]
WantedBy=다중 사용자.대상

서비스 로그를 읽으려면 journalctl일반적인 방법으로 사용하면 됩니다. 서비스 관리자는 프로세스가 생성될 때 프로세스 ID를 기억하여 프로세스를 추적하며 불안정하고 위험한 PID 파일 메커니즘이 필요하지 않습니다.

추가 읽기

답변2

에 잘못된 같음 문자를 배치했습니다 my-portal.service. 또는 쉘 스크립트를 제거하고 SystemD가 프로세스를 직접 관리하도록 해야 합니다.

이 시도:

[Unit]
Description=My Portal Service
After=network.target

[Service]
Type=Simple
ExecStart=/usr/bin/java -jar /opt/apps/egp/stage/my-portal/target/my-portal.jar server /opt/apps/egp/stage/my-portal/target/my-portal.yml

[Install]
WantedBy=multi-user.target

관련 정보