첫 번째 서비스가 예상대로 작동하도록 노력하고 있습니다 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
시도했습니다 ), 및/또는 명령줄 끝에 및/또는 둘 다 사용합니다.simple
oneshot
forking
&
ExecStart
nohup
gateway.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
. 시간 초과가 필요한지 확실하지 않지만 적어도 디버깅할 때 도움이 됩니다.