Rhel 7: 백그라운드 옵션이 제공되면 systemd가 프로세스를 시작하지 못합니다.

Rhel 7: 백그라운드 옵션이 제공되면 systemd가 프로세스를 시작하지 못합니다.

시스템 단위 파일(serv_unit.service)이 있습니다.

[Unit]
Description=My service

[Service]
Type=simple
Restart=always
RestartSec=60
StartLimitInterval=400
StartLimitBurst=3
ExecStart=/etc/init.d/myscript start

[Install]
WantedBy=multi-user.target

/etc/init.d/myscript

source /etc/myfile.sh # JAVA_home & other vars are resolved through this file
mode=$1
case "$mode" in
  'start')
    # Start daemon
    daemon --user=abc $JAVA_HOME/bin/java -cp $appClassPath $MAIN_CLASS $args &

내가 직면하고 있는 문제는 다음 명령을 실행할 때입니다.

systemctl start serv_unit.service

Java 프로세스가 표시되지 않습니다. 하지만 후행을 제거하면&즉:

daemon --user=abc $JAVA_HOME/bin/java -cp $appClassPath $MAIN_CLASS $args

Java 프로세스를 볼 수 있습니다(& Java 프로세스가 충돌하지 않아 백그라운드에서 충돌 가능성이 배제됨).

원인은 무엇입니까?

답변1

주요 질문 외에도 systemd에서 init.d 스크립트를 호출하는 것은 약간 중복되며 일반적으로 시작하기에는 나쁜 생각입니다. 이것이 필요한 전부입니다:

User=abc
EnvironmentFile=/etc/myfile.conf
ExecStart=/usr/bin/env $JAVA_HOME/bin/java -cp $appClassPath $MAIN_CLASS $args

EnvironmentFile은 일반 KEY=값 할당만 가능하지만 구성이 셸 스크립트 구문으로 이루어져야 하는 경우 다음을 사용할 수도 있습니다.

User=abc
ExecStart=/bin/sh -c ". /etc/myfile.sh && exec $$JAVA_HOME/bin/java -cp $$appClassPath $$MAIN_CLASS $$args"

SyslogIdentifier=( 서비스가 stdout 메시지를 생성하는 경우 두 경우 모두 설정해야 합니다 .)

서비스 유형

시스템화된 서비스는 특정 규칙을 따라야 합니다. 하나의 .service유닛에는 하나의 "기본" 데몬 프로세스만 있을 수 있으며, Type=옵션은 해당 프로세스가 어떻게 작동하는지 systemd에 알려줍니다.

Type=simple초기 프로세스(즉, ExecStart=에서 시작된 프로세스) 자체가 서비스의 기본 프로세스임을 나타냅니다. 기본 프로세스가 종료되자마자 서비스는 다음을 수행한 것으로 간주됩니다.중지됨, 남은 음식은 모두 정리됩니다.

이는 Type=simple을 사용하는 경우 데몬이~하지 않을 것이다'백그라운드'로 들어갑니다. 사실, 당신은 systemd에게 다음과 같이 말하고 있습니다.init.d 스크립트– 아니 daemon– 서비스의 주요 프로세스입니다...

따라서 init.d 스크립트가 실제 데몬을 백그라운드에 두려고 시도하지 않고 다음과 같이 시작하는 것이 가장 좋습니다 exec:

case "$mode" in
    'start-foreground')
        # Start daemon in foreground
        exec daemon --user=abc $JAVA_HOME/bin/java -cp $appClassPath $MAIN_CLASS $args

반면에,Type=forking초기 프로세스를 나타냅니다.~ 할 것이다시작 절차 중에 분기하고 종료해야 하며, 주 프로세스는 PIDFile=에서 또는 경험적으로 검색되어야 합니다.

어느 것을 사용할 것인가

데몬을 사용하면내장'데몬화' 모드에는 Type=forking중요한 이점이 있습니다. 시스템 서비스는 데몬이 마침내 백그라운드로 들어가려고 시도할 때까지 '시작' 상태를 유지하며, 백그라운드에서 마침내 '시작/활성' 상태로 이동합니다. 이는 종속성을 구성할 때 도움이 됩니다. 예를 들어 서비스 A는 "After=B.service"를 선언할 수 있습니다.

&그러나 데몬이 아직 준비되었는지 여부를 보고하는 어떤 것도 없이 쉘 기능과 같은 외부 수단에 의해 백그라운드 작업이 수행되는 경우 완전히 실패합니다.쓸모 없는Type=simple배경 옵션 없이 그냥 사용해야 할 수도 있습니다 .

관련 정보