
시스템 단위 파일(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
배경 옵션 없이 그냥 사용해야 할 수도 있습니다 .