예를 들어 bash 터미널에서 실행할 수 있는 서버가 있습니다.
java -jar spigot.jar
출력을 표준 출력(내 생각에는)으로 보내 터미널 화면에 인쇄합니다. 터미널에서 서버를 중지하려면 간단히 "stop" 명령을 서버에 보내면 서버가 종료를 시작합니다(현재 데이터 저장 등).
그러나 재부팅할 때마다 서버를 시작하거나 열린 프로세스에 추가 bash 터미널이 걸려 있는 것을 원하지 않기 때문에 서버를 자동으로 실행하도록 systemd 서비스를 설정하고 다음을 사용하려고 했습니다. .service 파일을 (실제로는 어디든) 다음과 같은 표준 입력을 얻습니다.
[Unit]
Description=Spigot Minecraft server daemon
[Service]
Restart=always
WorkingDirectory=*location where spigot.jar is*
StandardInput=tty
TTYPath=/dev/tty2
ExecStart=/usr/bin/java -jar spigot.jar
ExecStop=/bin/sh -c 'echo stop >/dev/tty2'
[Install]
WantedBy=multi-user.target
그러나 이것이 왜 작동하지 않는지 이해하지 못합니다. 내 생각엔 /dev/tty2를 서버로 파이프하는 것이고, 내가 다음 명령을 사용할 때
systemctl stop *service*
서버에 "stop"을 보내야 합니다(/dev/tty2를 통해 간접적으로). 내가 무엇을 놓치고 있나요?
그런데 서비스가 실행되지 않는 것 같은데요? StandardInput 및 TTYPath 행을 주석 처리하면 서버가 시작되지만 발행할 때
systemctl stop *service*
그런 다음 서버 로그를 확인하십시오.
journalctl -u *service*
올바른 종료 순서가 시작되지 않습니다. 프로세스가 단순히 종료됩니다(정상적으로 자체를 중지하는 대신).
그래서 제가 알고 싶은 것은 이 서버를 서비스로 실행하고 일부 FIFO/파일/tty/무엇이든 파이프에 연결하려면 어떻게 해야 합니까(그래서 계속 서버 명령을 실행할 수 있습니까)?
답변1
너무 열심히 노력하고 있는 것 같아요. 서비스를 종료하는 표준 방법은 SIGTERM 신호(폴라이트) 또는 SIGKILL 신호(강제)를 보내는 것입니다. 나는 이것이 기본 systemd
동작이라고 믿습니다. 따라서 유닛 파일에서 다음 줄을 모두 제거해 보세요 systemd
.
StandardInput=tty
TTYPath=/dev/tty2
ExecStop=/bin/sh -c 'echo stop >/dev/tty2'