업데이트 기능을 갖춘 Java 프로그램이 있습니다. 이 함수는 단지 jar를 시작한 다음 스스로 중지합니다. 업데이트 기능을 테스트하기 위해 프로그램을 수동으로 실행하면 제대로 작동합니다. 하지만 서비스로 프로그램을 시작하면 그렇지 않습니다. 이것은 서비스입니다:
[Unit]
Description=Starts the Main Java Programm
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash /usr/sbin/start.sh
TimeoutStartSec=0
User=USERNAME
[Install]
WantedBy=default.target
다음은 start.sh입니다(프로그램이 자동으로 다시 시작되지 않음).
#!/bin/bash
cd /home/USERNAME/bin/java
echo 'PASSWORD' | sudo -S java -jar variobox.jar > output.txt 2> error.txt
프로그램을 수동으로 호출하는 방법(프로그램이 올바르게 다시 시작되는 방법):
echo 'PASSWORD' | sudo -S java -jar variobox.jar > output.txt 2> error.txt &
다음은 Java 프로그램이 자체적으로 업데이트되는 방식입니다.
ProcessBuilder builder = new ProcessBuilder("java", "-jar", "variobox.jar");
builder.redirectOutput(new File("output.txt"));
builder.redirectError(new File ("error.txt"));
builder.start();
프로그램이 다시 시작된 후 2개의 txt 파일이 완전히 비어 있고 오류 메시지가 표시되지 않습니다. 재부팅되지 않습니다. 문제는 서비스의 일종의 사용자/액세스 제한이라고 생각합니다. 그러나 나는 이것을 완전히 이해할 만큼 리눅스를 잘 알지 못합니다. 나는 서비스에서 사용자를 설정하고 sudo
그것을 사용함으로써 작동해야 한다고 생각합니다.
편집하다:한번만 바꿔 Type=simple
보세요 Type=forking
. 하지만 그 후에도 재부팅이 되지 않습니다.