많은 관련 질문을 광범위하게 검색했지만 실제로 효과가 있는 것을 찾지 못했습니다.
그래서 시스템 서비스를 통해 자동화하려는 쉘 스크립트가 있습니다. 스크립트:
#!/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_notify
D-Bus
답변2
노력하다:
Type=oneshot
남성의 경우:
oneshot은 단순하게 작동하지만 서비스 관리자는 기본 프로세스가 종료된 후 장치를 고려합니다.