Centos 7에서 systemd를 사용하여 Tomcat 8.5 시작


1

Tomcat 8.5를 설치했으며 다음과 같이 수동으로 성공적으로 시작할 수 있습니다.

su tomcat startup.sh

제대로 작동하고 tomcat은 포트 8080에서 서비스를 제공 할 수 있습니다.

시작을 자동화해야하므로 /etc/systemd/system/tomcat-prod.service 파일을 작성했습니다.

[Unit]
Description=Tomcat 8.5 servlet container - Production
After=network.target

[Service]
Type=forking

ExecStart=/opt/appservers/production/apache-tomcat-8.5.37/bin/startup.sh
ExecStop=/opt/appservers/production/apache-tomcat-8.5.37/bin/shutdown.sh

User=tomcat
Group=tomcat   

[Install]
WantedBy=multi-user.target

파일은 의도적이며 모든 env 변수는 setenv.sh에 있습니다. 나는 그것을 사용하여 그것을 시도했다 :

# systemctl daemon-reload
# systemctl start tomcat-prod

위와 같은 이유로 Tomcat은 시작 직후 종료됩니다. 이유를 설명하는 로그가 없습니다. Tomcat은 시작시 빈 catalina.out 파일을 작성하고 systemctl 상태 tomcat-prod는 다음을 제공합니다.

tomcat-prod.service-Tomcat 8.5 서블릿 컨테이너-프로덕션로드 됨 :로드 됨 (/etc/systemd/system/tomcat-prod.service; 활성화 됨; 공급 업체 사전 설정 : 비활성화 됨) 활성 : 2019 년 금요일 이후로 실패 함 (결과 : 종료 코드) 01-04 08:08:27 UTC; 3s 전 프로세스 : 3583 ExecStop = / opt / appservers / production / apache-tomcat-8.5.37 / shutdown.sh (code = exited, status = 203 / EXEC) 프로세스 : 3569 ExecStart = / opt / appservers / production / apache- tomcat-8.5.37 / bin / startup.sh (code = exited, status = 0 / SUCCESS) 주 PID : 3581 (code = exited, status = 0 / SUCCESS)

1 월 04 일 08:08:27 * .net startup.sh [3569] : 시작하는 동안 기존 PID 파일이 발견되었습니다. 1 월 04 일 08:08:27 * .net startup.sh [3569] : 오래된 PID 파일 제거 / 삭제.

누군가 올바른 방향으로 나를 가리킬 수 있습니까?


나는 왜 ... 설명하는 코멘트없이 표 아래 사랑

.service 파일에 추가 된 envs로 시도해 볼 수 있습니까? 같은 오류가 발생합니까? shutdown.sh파일에 또한 bin당신이 그것을 이동하지 않은 경우, 디렉토리.
Aulis Ronkainen

@AulisRonkainen / bin은 오타가 수정되었습니다. 실제 스크립트에서 정확했습니다. env를 스크립트로 이동하려고 시도했지만 결과는 동일합니다. 로그가없고 시작되지 않습니다.
요한

답변:


2

Systemd는 모든 서비스의 "주요 프로세스"를 추적하여 서비스가 아직 살아 있는지 여부를 정확하게 알 수 있습니다. 기본 프로세스가 종료되면 서비스 관리자는 서비스가 다운되었거나 자체적으로 중지 된 것으로 가정합니다. 그리고 서비스가 중지되면 남은 모든 프로세스가 자동으로 종료되어 향후 시작을 위해 깨끗한 상태를 제공합니다.

위해 유형 = 분기 가 레이어와 레이어와 쉘 스크립트의 레이어 뒤에 숨겨진 특히, "메인"과정이 다소 어려울 수있는 결정, 서비스. systemd의 기본 휴리스틱은 일반 데몬에서 잘 작동하지만 경우에 따라 Tomcat 자체가 아닌 해당 셸 스크립트 계층 중 하나를 기본 프로세스로 잘못 감지했을 수 있습니다. 따라서 스크립트가 종료 되 자마자 서비스가 중지 된 것으로 가정하고 남은 부분 (실제 데몬 포함)이 종료됩니다.

두 가지 옵션이 있습니다.

  • "pidfile"을 사용하여 기본 프로세스를 명시 적으로 지정하십시오. 이것은 SysVinit에서 사용되는 일반적인 방법입니다. 시작 스크립트는 이미 Tomcat 데몬의 프로세스 ID를 일부 파일에 저장하므로 tomcat.service 장치는 PIDFile=옵션을 사용하여이를 참조해야합니다 . 이를 통해 서비스 관리자는 자동 감지 휴리스틱이 필요하지 않으며 제공된 PID를 기본 프로세스로 추적합니다.

  • 쉘 스크립트를 완전히 제거하고 ExecStart = 옵션 에서 직접 Tomcat을 시작하십시오 . 이것은 systemd에 권장되는 방법이며 다양한 배포판의 패키저가 이미 작성한 예제 .service unit을 찾을 수 있습니다. 예를 들어, Arch Linux (Tomcat 8 with Jsvc) 입니다.


이 모든 것이 의미가 있습니다. chkconfig를 사용하여 이전 배포에서 업그레이드하여 systemd를 처음 만났습니다.
요한

글쎄, 그것은 해결했다.
요한

1

의심 할 여지없이 grawity는 이미 저자가 "우리는 이미 더 나은 d 몬 감독관을 가지고있다. 그것은 체계화되어있다"고 언급 한 다른 곳에서 언급 된 체계화 된 공포를 이미 알고있다 . 이것은 우리도 jsvc가 필요하지 않다는 것을 의미한다. 그러나이 페이지에서 저자는 "Bonus Track"을 추가합니다. "M. Benjamin이 start가 아닌 run으로 catalina.sh를 호출한다는 사실에 유의하십시오. 실제로 catalina.sh를 통해 dæmons를 실행하는 시스템을위한 다른 경로가 있습니다. 산란하지 말라 " 조나단 드 보인 폴라드의 스크립트에 몇 개조하면 되겠 어를 추가하면 다음에 저를 이끌어 ) 쓰기 너무 열심히하지, B ) 기능 불필요한 층을 제거하기 위해 나타납니다,

# file: /usr/local/lib/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat

ExecStart=/opt/apache/tomcat/bin/catalina.sh run
Type=simple

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

추가 옵션에 대해서는 catalina.sh 스크립트의 상단을 참조하십시오.

#   Do not set the variables in this script. Instead put them into a script
#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.