스크립트(예상)가 반환되었기 때문에 systemd 서비스가 오류로 인해 종료되었습니다.

스크립트(예상)가 반환되었기 때문에 systemd 서비스가 오류로 인해 종료되었습니다.

많은 관련 질문을 광범위하게 검색했지만 실제로 효과가 있는 것을 찾지 못했습니다.

그래서 시스템 서비스를 통해 자동화하려는 쉘 스크립트가 있습니다. 스크립트:

#!/usr/bin/env bash

SESSION="daemon"
DAEMON_WINDOW="daemon"
CLIENT_WINDOW="client"

tmux new-session -d -s $SESSION
tmux rename-window -t 0 $DAEMON_WINDOW
tmux send-keys -t $DAEMON_WINDOW 'cd $HOME/work/gastd' C-m './gastd' C-m

sleep 30

tmux new-window -t $SESSION:1 -n $CLIENT_WINDOW 
tmux send-keys -t $CLIENT_WINDOW 'gast-client' C-m

tmux attach-session -t $SESSION:1

좋습니다. 쉘에서 실행하면 잘 작동합니다. 기본적으로 창에서 데몬 프로세스를 시작합니다. 데몬이 무언가를 초기화하므로 기다려야 하고 잠자기 후에 클라이언트로 두 번째 창을 시작합니다.

이제 systemd로 실행하면 실제로는 정상적으로 시작된 다음 실패하고 종료되는 것 같습니다.

이유는 간단하다고 생각합니다. 모든 것이 실행되고 스크립트가 종료되므로 systemd는 스크립트가 종료되고 서비스가 존재한다고 가정합니다. tmux 세션과 창을 종료하는 것이 실제 문제입니다.

목표는 systemctl stop service를 실행하지 않는 한 세션과 창을 영원히 실행하는 것입니다.

스크립트 끝에 무한 루프를 추가할 수 있지만 보기에는 좋지 않습니다.

더 좋은 방법이 있나요? 나는 그것을 시도했지만 Type=forking그것도 도움이 되지 않았고 어떤 이유로든 충돌이 발생했습니다.

이것은 내 현재 시스템 스크립트입니다.

[Unit]
Description=gast daemon

[Service]
ExecStart=/home/gastuser/start-tmux-session.sh
WorkingDirectory=/home/gastuser/work/gastd
User=gastuser
StandardOutput=file:/home/gastuser/.gast/gast.log
StandardError=file:/home/gastuser/.gast/gast.log
Restart=on-failure

[Install]
WantedBy=multi-user.target

정말 광범위한 검색을 했습니다. 질문/답변이 이미 존재한다면 죄송합니다.

답변1

다음에서 읽기문서:

systemd의 간단한 서비스 유형은 다음과 같습니다.

oneshot짧은 시간 안에 완료되었다가 완전히 종료되는 서비스입니다.

simple포그라운드에서 실행되는 프로그램입니다. 따라서 systemd는 부팅이 언제 완료되었는지 확인할 수 없으며 즉시 시작된다고 가정합니다.

forking백그라운드 작업 실행에 적합한 클래식 2포크 데몬 또는 프로세스입니다. 원래 프로세스가 종료되면 서비스 시작이 완료된 것으로 가정합니다. 서비스는 하위 프로세스가 실행 중일 때 실행 중인 것으로 간주됩니다. systemd의 추측이 잘못된 경우 PID 파일을 제공하여 하위 프로세스를 찾을 수 있습니다.

simple나는 당신이 가지고 있는 것이 a 또는 a 라고 생각 forking하지만, tmux그것을 사용하면 엉망이 될 것입니다. 내 생각에 tmux세션은 명목상 데몬이 소유하고 있는 것 같습니다 tmux. 따라서 systemd는 서비스가 여전히 실행 중인지 반드시 확신할 수 없으며 서비스가 일찍 종료되었음을 선언합니다. 30초 절전 모드 forking는 기본 부팅 시간 초과 등을 초과 할 수 있으므로 도움이 되지 않을 수 있습니다 oneshot.

이 문제를 해결하려면 기존의 일반 백그라운드 작업으로 변환 &하거나 시스템에 어떤 프로세스가 자신의 것인지, 시작이 언제 완료되는지 명시적으로 알려주는 방법을 찾아야 할 수도 있습니다. 분기된 작업의 경우 PID 파일을 설정한 다음 옵션을 사용하여 systemd에 해당 파일을 찾을 수 있는 위치를 알려줌으로써 이를 수행할 수 있습니다 PIDFile=. 또 다른 옵션은 유형의 서비스를 생성하거나 를 notify호출 하거나 미리 정의된 인터페이스 이름을 사용하여 dbus직접 시작할 수 있음을 systemd에 알리는 것입니다 . 그럼에도 불구하고 tmux가 이것으로 무엇을 할 것인지 잘 모르겠습니다.sd_notifyD-Bus

답변2

노력하다:

Type=oneshot

남성의 경우:

oneshot은 단순하게 작동하지만 서비스 관리자는 기본 프로세스가 종료된 후 장치를 고려합니다.

관련 정보