재부팅 시 화면을 실행하도록 systemd 서비스를 설정하는 중에 문제가 발생했습니다.

재부팅 시 화면을 실행하도록 systemd 서비스를 설정하는 중에 문제가 발생했습니다.

SSH를 통해서만 액세스할 수 있는 CentOS 7을 실행하는 원격 서버가 있습니다. ISP가 다시 시작된 후에도 두 Java 서버가 항상 실행되기를 원합니다.

그래서 화면에서 두 개의 Java 서버를 시작하는 시스템 서비스를 만들어 보았습니다. 서비스를 시작하면 오류 메시지가 나타나지 않지만 즉시 사라집니다. (systemctl status -l blogpatcher.service)

    * blogpatcher.service - Start blogpatcher servers
Loaded: loaded (/etc/systemd/system/blogpatcher.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sat 2020-02-08 04:19:09 EST; 7s ago
Process: 22388 ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh (code=exited, status=0/SUCCESS)
Main PID: 22388 (code=exited, status=0/SUCCESS)

이것은 blogpatcher.service 파일입니다:

# vi /etc/systemd/system/blogpatcher.service

[Unit]

Description=Start blogpatcher servers

After=network.target


[Service]

Type=simple

ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh

TimeoutStartSec=90


[Install]

WantedBy=default.target

다음은 서비스가 실행되는 스크립트 파일입니다.

# vi /var/tmp/test_script.sh
#!/bin/bash
screen -dmS syn bash -c 'cd /home/blogpatc/server/;java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer;exec bash'

SSH 콘솔에서 스크립트 파일을 실행하면 예상대로 작동하지만 오류 메시지가 없기 때문에 약간 혼란스럽고 문제가 무엇인지 아는 사람이 있는지 궁금합니다.

답변1

[Service] 섹션 아래에 "RemainAfterExit=yes"를 추가하면 화면이 열린 상태로 유지됩니다.

답변2

문제는 아마도 exec bash마지막에 올 것 같습니다. 입력을 받지 못해서 bash종료됩니다. 쉘을 실행하면 동일한 일이 발생합니다. 입력이 남지 않으므로 쉘이 종료됩니다.

그러나 더 근본적으로: 왜 사용합니까 screen? 여기에는 어떤 이점이 있나요?

systemd가 재부팅을 하게 하면 무슨 문제가 있나요?

[Unit]
Description=Start blogpatcher server  
After=network.target

[Service]   
Type=simple
ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh
TimeoutStartSec=90
Restart=always
RestartSec=10

[Install]
WantedBy=default.target

그리고

#!/bin/bash
cd /home/blogpatc/server/
java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer

Systemd에는 많은 추가 매개변수와 가능성이 있으므로 이에 대해 읽어보고 싶을 수도 있습니다. 예를 들어, 스크립트가 작업 디렉토리를 설정하는 데만 사용되는 경우(제가 가정하는 것처럼 더 복잡한 시작 스크립트의 시작으로 사용되지 않는 경우) WorkingDirectory주석에 제안된 대로 JdeBP를 살펴보는 것이 좋습니다 .

시작 스크립트에서 이를 사용하려고 한다면 screen유닛 파일의 서비스 섹션은 아마도 다음과 같을 것입니다:

[Service]
Type=simple
Restart=on-failure
WorkingDirectory=/home/blogpatc/server/
RestartSec=3
ExecStart=/usr/bin/screen -L -dm java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer

아니면 Type=forking대신 탐색해 보세요 Type=simple.

답변3

execscreen 앞에 명령을 추가하여 bash 프로세스를 screen 프로세스로 바꿀 수 있습니다 . 이를 통해 systemctl화면 프로세스가 종료된 시기를 식별하고 다시 시작 정책 메커니즘을 사용하여 다시 시작할 수 있습니다. 수정된 스크립트는 다음과 같습니다.

# vi /var/tmp/test_script.sh
#!/bin/bash
exec screen -dmS syn bash -c 'cd /home/blogpatc/server/;java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer;exec bash'

재시작 정책을 지정하는 방법은 다음과 같습니다.

[Service]
# ...
Restart=always

관련 정보