데비안 배포판을 통해 내 애플리케이션을 데몬/서비스로 실행하려고 합니다 systemd
. 이것은 내 서비스 파일입니다.
[Unit]
Description=MyApp Service
After=multi-user.target
[Service]
Type=simple
Restart=always
ExecStart=sudo /usr/bin/java -jar /home/pi/myapp.jar
[Install]
WantedBy=multi-user.target
그런 다음 다음을 /lib/systemd/system/myapp.service
실행했습니다.
sudo systemctl enable myapp
그런 다음 상태를 확인합니다.
sudo systemctl status myapp
다음 오류가 표시됩니다.
● myapp.service - MyApp Service
Loaded: error (Reason: Invalid argument)
Active: inactive (dead)
Sep 29 09:56:24 raspberrypi systemd[1]: [/lib/systemd/system/myapp.service:8] Executable path is not absolute, ignoring: sudo /usr/bin/java -jar /home/pi/myapp.jar
Sep 29 09:56:24 raspberrypi systemd[1]: myapp.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
이 작업을 수행하면 which java
다음이 표시됩니다.
pi@raspberrypi:/lib/systemd/system $ which java
/usr/bin/java
systemd
그래서 실행 경로에 대해 불평하는 이유를 이해할 수 없습니다 .문제를 해결하는 방법에 대한 아이디어가 있습니까?
답변1
경로 sudo
가 절대적인 것은 아닙니다. systemd 장치가 시스템 장치인 경우 시스템 장치는 기본적으로 루트로 실행되므로 sudo가 필요하지 않습니다.
편집: JVM 및 전체 Java 애플리케이션을 루트로 실행하는 대신 권한이 없는 사용자로 서비스를 실행하십시오. 애플리케이션에 권한이 없는 사용자에게 일반적으로 부여되지 않는 특정 기능이 필요한 경우 설정을 통해 추가할 수 있습니다 AmbientCapabilities
. 예를 들어 섹션에 다음 줄을 추가하면 됩니다 [Service]
.
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
서비스는 사용자로 실행되지만 기능이 nobody
부여됩니다 CAP_SYS_RAWIO
.