나는 이 서비스를 /etc/systemd/system에 다음과 같이 작성했습니다 nexusiq.service
.
[Unit]
Description=Nexus IQ Service
After=network.target
[Service]
Type=simple
ExecStart=/etc/init.d/nexus-iq-server start
ExecStop=/etc/init.d/nexus-iq-server stop
User=root
Restart=on-abort
TimeoutSec=600
[Install]
WantedBy=multi-user.target
ExecStart 및 ExecStop에서 호출되는 /etc/init.d의 스크립트는 nexus-iq-server
"start" 또는 "stop"을 인수로 제공하는지 여부에 따라 다음을 수행합니다.
NEXUS_IQ_SERVER_HOME=/apps/nexus/nexus-iq-server
VERSION=1.127.0-01
JAVA_OPTIONS="-Xmx4096m -XX:+UseG1GC"
RUN_AS_USER=root
do_start()
{
cd $NEXUS_IQ_SERVER_HOME
su -m $RUN_AS_USER --command "java $JAVA_OPTIONS -jar nexus-iq-server-$VERSION.jar server config.yml 2> stderr.log &"
echo "Started nexus-iq-server"
}
do_console()
{
cd $NEXUS_IQ_SERVER_HOME
su -m $RUN_AS_USER --command "java $JAVA_OPTIONS -jar nexus-iq-server-$VERSION.jar server config.yml 2> stderr.log"
}
do_stop()
{
pid=`ps aux | grep nexus-iq-server | grep '.jar server' | grep -vE '(stop|grep)' | awk '{print $2}'`
kill $pid
echo "Killed nexus-iq-server - PID $pid"
}
do_usage()
{
echo "Usage: nexus-iq-server [console|start|stop]"
}
case $1 in
console)
do_console
;;
start)
do_start
;;
stop)
do_stop
;;
*)
do_usage
;;
esac
서비스를 활성화했습니다.
명령을 실행하면
systemctl start nexusiq
ExecStart에 할당된 명령이 올바르게 호출됩니다. 그런데 명령어를 실행하면 systemctl stop nexusiq
ExecStop에 할당된 명령어가 호출되지 않습니다.
또한 systemctl status nexusiq
다음 명령을 실행하면 서비스가 비활성화된 것처럼 보입니다.
● nexusiq.service - Nexus IQ Service
Loaded: loaded (/etc/systemd/system/nexusiq.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Wed 2021-11-17 12:56:03 CET; 16s ago
Process: 14806 ExecStop=/etc/init.d/nexus-iq-server stop (code=exited, status=0/SUCCESS)
Process: 14800 ExecStart=/etc/init.d/nexus-iq-server start (code=exited, status=0/SUCCESS)
Main PID: 14800 (code=exited, status=0/SUCCESS)
Nov 17 12:56:03 nexusiq2 systemd[1]: Started Nexus IQ Service.
Nov 17 12:56:03 nexusiq2 su[14801]: (to root) root on none
Nov 17 12:56:03 nexusiq2 nexus-iq-server[14800]: Started nexus-iq-server
이 문제의 원인과 해결 방법을 설명해 줄 수 있는 사람이 있나요?
답변1
Type=forking
대신에 필요합니다 Type=simple
.
매뉴얼 페이지에는 다음과 같이 나와 있습니다.
- simple로 설정된 경우(ExeStart=가 지정되었지만 Type=이나 BusName=이 지정되지 않은 경우 기본값) 서비스 관리자는 기본 서비스 프로세스가 분기된 직후에 장치가 시작되는 것으로 간주합니다. ExecStart=로 구성된 프로세스는 서비스의 기본 프로세스가 될 것으로 예상됩니다. 이 모드에서 프로세스가 시스템의 다른 프로세스에 기능을 제공하는 경우 서비스 관리자가 실행을 시작하므로 서비스가 시작되기 전에 해당 통신 채널을 설치해야 합니다(예: 소켓 활성화를 통해 systemd에 의해 소켓이 설정됨). 즉시 다음은 메인 서비스 프로세스를 생성한 후 서비스의 바이너리를 실행하기 전에 -up 유닛을 동작시킵니다. 이는 서비스의 바이너리를 성공적으로 호출할 수 없는 경우에도(예: 선택한 User=가 존재하지 않거나 서비스 바이너리가 누락된 경우) 단순 서비스에 대한 systemctl start 명령줄이 성공을 보고한다는 것을 의미합니다.
- 분기로 설정된 경우 ExecStart=로 구성된 프로세스는 시작의 일부로 분기()를 호출해야 합니다. 시작이 완료되고 모든 통신 채널이 설정되면 상위 프로세스가 종료될 것으로 예상됩니다. 하위 프로세스는 계속해서 기본 서비스 프로세스로 실행되며, 상위 프로세스가 종료되면 서비스 관리자는 해당 유닛이 시작된 것으로 간주합니다. 이는 기존 UNIX 서비스의 동작입니다. 이 설정을 사용하는 경우 systemd가 서비스의 기본 프로세스를 안정적으로 식별할 수 있도록 PIDFile= 옵션도 사용하는 것이 좋습니다. 상위 프로세스가 종료되면 systemd는 계속해서 후속 유닛을 시작합니다.
대체로 /etc/init.d/nexus-iq-server start
시스템화된 작업이 완료되면 서비스가 완료됩니다. 따라서 비활성(중지)으로 간주됩니다. systemd
나머지 Java 프로세스는 정리하고 종료해야 하는 프로세스로 처리됩니다. systemctl stop
장치가 중지되었으므로 아무 작업도 수행되지 않습니다.
프로세스가 생성되고 종료될 것으로 예상하도록 Type=forking
systemd에 지시합니다 . ExecStart=
생성된 프로세스는 systemd가 추적하는 기본 PID가 됩니다.