Run a Java Application as a Service on Linux λ₯Ό μ°Έκ³ ν•΄λ³΄λ‹ˆ Systemd μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•΄μ„œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μ„œλΉ„μŠ€λ₯Ό 등둝할 수 μžˆλ‹€λŠ” 것을 μ•Œκ²Œλ˜μ—ˆλ‹€. κ·Έλ™μ•ˆ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜κΈ° μœ„ν•œ μ‰˜ 슀크립트λ₯Ό μž‘μ„±ν•˜μ—¬ μ‹€ν–‰ν•˜κ³  μ’…λ£Œν•˜κ³  λ°°ν¬ν•΄μ˜€κ³€ ν–ˆλ‹€. λ°˜λ©΄μ— Nginx의 경우 νŒ¨ν‚€μ§€λ‘œ μ„€μΉ˜ν•˜μ—¬ μžλ™μœΌλ‘œ μ„œλΉ„μŠ€κ°€ λ§Œλ“€μ–΄μ Έμ„œ μ‰½κ²Œ μ‹€ν–‰ν•  수 μžˆμ—ˆλ‹€. μ‹ κ·œ ν”„λ‘œμ νŠΈλ‘œ 인해 데λͺ¨μš© μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μƒˆλ‘­κ²Œ λ°°ν¬ν•΄μ•Όν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ΄ 생겼기에 μ΄λ²ˆμ—λŠ” Systemd μ„œλΉ„μŠ€λ‘œ λ“±λ‘ν•˜μ—¬ κ΄€λ¦¬ν•΄λ³΄μž.

Systemd μ„œλΉ„μŠ€ λ“±λ‘ν•˜κΈ°

/etc/systemd/system/ 폴더 ν•˜μœ„μ— vi λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ μ•„λž˜μ™€ 같이 μ„œλΉ„μŠ€ νŒŒμΌμ„ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ˜λŠ” μ„œλΉ„μŠ€ 이름을 파일λͺ…μœΌλ‘œ μž‘μ„±ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€.

/etc/systemd/system/app.service
[Unit] Description=Java application service After=syslog.target network.target [Service] Type=simple SuccessExitStatus=143 Restart=on-failure RestartSec=10s User=ubuntu Group=ubuntu WorkingDirectory=/home/ubuntu/ Environment=JAVA_HOME=/home/ubuntu/.sdkman/candidates/java/current ExecStart=/bin/java -jar /home/ubuntu/app.jar ExecStop=/bin/kill -15 $MAINPID [Install] WantedBy=multi-user.target

λ¦¬λˆ…μŠ€ μ„œλ²„μ— μ—¬λŸ¬κ°œμ˜ μžλ°” 버전을 ν˜Όμš©ν•˜λŠ” 경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œ ν•„μš”ν•œ JDK 버전을 μ‚¬μš©ν•  수 μžˆλ„λ‘ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ§€μ •ν•˜λ„λ‘ ν•˜μž. 예기치 μ•Šμ€ μƒν™©μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œλ˜λŠ” 경우 λ‹€μ‹œ 싀행될 수 μžˆλ„λ‘ Restart μ˜΅μ…˜μ„ μ μš©ν•˜λŠ” 것을 κ³ λ €ν•˜μž.

Systemd μ„œλΉ„μŠ€ μ‹€ν–‰ν•˜κΈ°

service λͺ…λ Ήμ–΄λ₯Ό 톡해 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν•˜κ³  μ’…λ£Œν•  수 μžˆμœΌλ‚˜ systemctl λͺ…λ Ήμ–΄λ₯Ό 톡해 μ„œλΉ„μŠ€λ₯Ό λ°˜μ˜ν•˜κ³  λ¦¬λˆ…μŠ€ μ„œλ²„κ°€ λ‹€μ‹œ μ‹€ν–‰λ˜μ–΄ systemd μ„œλΉ„μŠ€κ°€ μ‹€ν–‰λ˜λ©΄ μžλ™μœΌλ‘œ μ‹œμž‘λ  수 μžˆλ„λ‘ enable λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것이 μ’‹λ‹€.

Termianl
sudo systemctl daemon-reload # Systemd μ„œλΉ„μŠ€ μ‹œμž‘ μ‹œ μžλ™ μ‹€ν–‰ 등둝 ubuntu@ubuntu:~$ sudo systemctl enable app.service Created symlink /etc/systemd/system/multi-user.target.wants/app.service β†’ /etc/systemd/system/app.service. sudo systemctl status app.service # sudo service app status ubuntu@ubuntu:~$ sudo service app status ● app.service - Java application service Loaded: loaded (/etc/systemd/system/app.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2023-10-12 14:01:24 UTC; 22min ago Main PID: 25835 (java) Tasks: 23 (limit: 2256) Memory: 150.6M CGroup: /system.slice/app.service └─25835 /bin/java -jar /home/ubuntu/app.jar

가끔씩 νŒ¨ν‚€μ§€λ‘œ μ„€μΉ˜ν•œ μ„œλΉ„μŠ€λ“€μ΄ 예기치 μ•Šμ€ μƒν™©μœΌλ‘œ λ¦¬λˆ…μŠ€ μ„œλ²„κ°€ μž¬μ‹€ν–‰λ˜μ—ˆμ„λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” 상황이 μ’…μ’… λ°œμƒν•œλ‹€.
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ” 것에 κ·ΈμΉ˜μ§€ μ•Šκ³  λ‹€μ–‘ν•œ λ¬Έμ œμ— λŒ€ν•΄ κ³ λ―Όν•΄μ•Όν•  ν•„μš”μ„±μ΄ μžˆλŠ” 것 κ°™λ‹€.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그 μ‘°νšŒν•˜κΈ°

일반적으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μƒμ„±ν•œ 둜그 νŒŒμΌμ„ tail λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚΄νŽ΄λ³΄μ•˜μœΌλ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλΉ„μŠ€λ‘œ λ“±λ‘ν•˜μ˜€κΈ°μ— λ³„λ„μ˜ 파일둜 μ €μž₯ν•˜λŠ” μ˜΅μ…˜μ„ 두지 μ•Šμ•˜λ‹€λ©΄ journalctl λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ 둜그λ₯Ό μ‘°νšŒν•΄μ•Όν•œλ‹€.

Terminal
sudo journalctl -u app.service -f

μš΄μ˜μ€‘μΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ μ„œλΉ„μŠ€μ˜ 경우 잘 λ™μž‘ν•˜λŠ” μ‰˜ 슀크립트λ₯Ό ꡳ이 μ„œλΉ„μŠ€ λ°©μ‹μœΌλ‘œ λ°”κΎΈμ§€λŠ” 말자.