시스템 서비스에 의해 시작된 프로세스를 활성 상태로 유지하는 데 문제가 있습니다.

시스템 서비스에 의해 시작된 프로세스를 활성 상태로 유지하는 데 문제가 있습니다.

첫 번째 서비스가 예상대로 작동하도록 노력하고 있습니다 systemd. 이것이 내가 가진 것입니다:

gateway-watchdog.service:

# A systemd service for the Gateway Watchdog

[Unit]
Description=gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running

[Service]
Type=simple
User=root
WorkingDirectory=/home/ubuntu/lora_gateway/
ExecStart=/home/ubuntu/lora_gateway/watchdog.sh

[Install]
WantedBy=multi-user.target

gateway-watchdog.timer:

[Unit]
Description=gateway-watchdog: Timer to run the associated gateway-watchdog service

[Timer]
# Run service 1 minute after boot
OnBootSec=1min
# Run service 15 minutes after the last run
OnUnitActiveSec=30s

[Install]
WantedBy=timers.target

watchdog.sh다음 줄이 있습니다(일부 if문에 포함되어 있음).

#!/bin/bash
...
if [[condition]]; then
    command="python3 gateway.py"
        # Process needs to be run in the background with '&'. If it isn't, the systemd service will treat this script
        # as still running and so not re-run it at the time specified by the timer service.
    echo "2 $(date +'%F %T'): Running: $command" >> $LOG_FILE_PATH
    eval "$command"
        # Command must be run using eval. If it isn't, the ampersand at the end of the command is effectively ignored
    exit
fi

나는 필요하다:

서비스가 실행됩니다 watchdog.sh. if스크립트의 조건이 true 이면 별도의 프로세스로 시작되었다가 종료되며, 해당 서비스는 더 이상 활성화된 것으로 간주되지 않으므로 30초 후에 다시 실행됩니다 watchdog.sh.python3 gateway.py

다양한 서비스를 다양하게 조합하여 ( , 및 를 Type시도했습니다 ), 및/또는 명령줄 끝에 및/또는 둘 다 사용합니다.simpleoneshotforking&ExecStartnohupgateway.py

활성 상태로 유지 되면 python3 gateway.py항상 서비스의 일부가 되므로 CGroup서비스가 유지됩니다 active (running).

내가 원하는 것을 달성하기 위해 이 행동을 어떻게 바꿀 수 있습니까? 어떤 아이디어라도 크게 감사하겠습니다.

편집하다: U의 제안에 따라 변경된 내용을 반영하기 위해 위의 파일 내용을 업데이트했습니다.

위에 제공된 문서를 기반으로 sudo systemctl status gateway-watchdog.service다음을 제공합니다.

● gateway-watchdog.service - gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running
     Loaded: loaded (/etc/systemd/system/gateway-watchdog.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-01-13 01:45:25 UTC; 8s ago
TriggeredBy: ● gateway-watchdog.timer
   Main PID: 30684 (watchdog.sh)
      Tasks: 3 (limit: 4435)
     CGroup: /system.slice/gateway-watchdog.service
             ├─30684 /bin/bash /home/ubuntu/lora_gateway/watchdog.sh
             └─30696 python3 gateway.py

Jan 13 01:45:25 ubuntu systemd[1]: Started gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running.

좋음: gateway.py프로세스가 계속 실행 중입니다. 오류: 이전 실행이 여전히 활성 상태이므로 서비스가 30초 동안 다시 실행되지 않습니다.

&back 을 넣으면 다음 과 command="python3 gateway.py &"같이 sudo systemctl status gateway-watchdog.service됩니다.

● gateway-watchdog.service - gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running
     Loaded: loaded (/etc/systemd/system/gateway-watchdog.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Thu 2022-01-13 01:49:05 UTC; 6s ago
TriggeredBy: ● gateway-watchdog.timer
    Process: 33724 ExecStart=/home/ubuntu/lora_gateway/watchdog.sh (code=exited, status=0/SUCCESS)
   Main PID: 33724 (code=exited, status=0/SUCCESS)

Jan 13 01:49:05 ubuntu systemd[1]: Started gateway-watchdog: Watchdog to ensure that Gateway (gateway.py) is running.
Jan 13 01:49:05 ubuntu systemd[1]: gateway-watchdog.service: Succeeded.

좋음: 서비스가 비활성 상태이므로 30초 후에 다시 실행됩니다. 나쁨: python3 gateway.py프로세스가 즉시 종료됩니다.

답변1

참고해서 해결방법을 찾았습니다https://stackoverflow.com/a/57041270/2909854. 현재 라인은 command다음과 같습니다 watchdog.sh.

command="systemd-run --scope -E setsid nohup python3 $GATEWAY_SCRIPT_PATH"

Type또한 내 서비스 설정을 로 변경 forking하고 추가 해야 했습니다 TimeoutSec=1. 시간 초과가 필요한지 확실하지 않지만 적어도 디버깅할 때 도움이 됩니다.

관련 정보