귀하의 게시물을 기반으로 단위 파일을 수정했습니다.
[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 파일 메커니즘이 필요하지 않습니다.
추가 읽기
- 조나단 데보인 폴라드(2015).무의미한 추가 레이어로 Apache Tomcat 래핑 체계화된 공포의 집.
- 조나단 데보인 폴라드(2015). 시스템화 된 공포의 집. 자주 주어지는 답변입니다.
- /usr/bin/env가 시스템 로그에서 실행 파일로 표시되는 것을 방지하는 방법
- systemd를 사용하여 Java 데몬 구성
- 조나단 데보인 폴라드(2016).금세기에는 또는 를 사용하지 마십시오
logrotate
.newsyslog
. 자주 주어지는 답변입니다.
답변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