환경 설정 실행 가능 경로로 시스템 단위 파일 작성


17

Java 응용 프로그램의 시스템 단위 파일을 작성 중이며 시작하는 데 사용되는 Java 버전을 제어하고 싶습니다. 내 (간체 화 된) 서비스 파일은

[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143

시작하려고하면 오류가 다시 발생합니다.

Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/app@.service:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: app@1.0.0.service lacks both ExecStart= and ExecStop= setting. Refusing.

나는 그것이 JAVA_HOME올바르게 설정되어 있다는 것을 안다 . ExecStart줄을 변경하여 시작한 /usr/bin/java다음 -DsomeOption=${JAVA_HOME}잘 볼 수 있는 것처럼 추가 하십시오.

명백한 해결 방법은 래퍼 스크립트를 작성하는 것이지만 서비스 파일을 사용하는 시점을 무너 뜨린다 고 생각합니다.

단위 파일을 사용하여 Java 애플리케이션에 JAVA_HOME을 설정하는 방법


랩퍼 스크립트가 서비스 파일 사용의 목적을 정확히 무효화하는 이유는 무엇입니까? 여전히 시스템의 시퀀싱 및 종속성 추적, 모니터링 등을 얻을 수 있습니다. 기본적으로 시스템은 SysVinit와 함께 제공되는 자유 형식 프로그래밍 기능을 구운 DTRT 논리 에 유리하게 교환 합니다. "올바른 것"이 체계화되지 않은 것이라면, 쉘 스크립트에서와 같이 외부 체계를 넣어야합니다.
워렌 영

@WarrenYoung-갑자기 쉘 스크립트 관리를 다시 시작하기 때문입니다. 필자의 경우 쉘 스크립트를 관리하지 않는 것이 다른 비트보다 유용합니다.
Robert Munteanu

나는 정말로 문제를 보지 못한다. 관리해야하는 모든 실행 파일에 대해 걱정하면서 하루를 보내십니까? :)
Warren Young

3
systemd.service (5)에서 : "첫 번째 인수 (즉, 실행할 프로그램)는 변수가 아닐 수 있습니다." 이는 $ {JAVA_HOME}이 애플리케이션 경로의 시작 부분에서 확장되지 않지만 나중에 사용될 때의 이유를 설명합니다.
Wieland

@WarrenYoung-바이너리보다 단일 래퍼를 선호합니다. 나는 그것이 모든 사람에게 문제가 아니라는 것을 이해하지만 그것은 나를위한 것이다 :-)
Robert Munteanu

답변:


12

systemd.service (5)의 "명령 줄"섹션에서 :

첫 번째 인수 (즉, 실행할 프로그램)는 변수가 아닐 수 있습니다.

인스턴스 지정자를 사용하는 것이 좋습니다 %i(systemd.unit (5)에서 더 자세히 읽을 수 있지만) (지금 우리는 systemd.service (5)로 돌아 왔습니다) :

명령 행의 첫 번째 인수 (즉, 실행할 프로그램)는 지정자를 포함하지 않을 수 있습니다.

이 시점에서 가장 좋은 옵션은 Warren Young이 제안한대로 자바 바이너리의 실행을 래핑하는 쉘 스크립트를 작성하는 것입니다. 다음 예제가있는 systemd.service (5) :

ExecStart=/bin/sh -c 'dmesg | tac'

그래서 당신은 할 수 있습니다 (평가되지 않음) :

ExecStart=/bin/sh -c '${JAVA_HOME}....'

2

또 다른 유사한 옵션은 다음을 사용하는 것입니다 /usr/bin/env.

ExecStart=/usr/bin/env "${JAVA_HOME}/bin/java" -jar ...

이렇게 '하면 전체 명령 주위에서 따옴표 를 생략 할 수 있으며 따옴표로 묶은 물건을 중첩 해야하는 경우 유용합니다.

추신. 참고로 변수 이름 을 Systemd 파일 에서 {중괄호 로 묶어야 }합니다. 그렇지 않으면 올바르게 인식되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.