Systemd
Systemd 看門狗和通過 Docker 通知
所以我一直在配置這個 Docker 設置以在 Linux 上執行一個簡單的服務。該服務使用 systemd 看門狗和 sdnotify python 庫來確保服務不會凍結。我的問題是通知似乎沒有從 docker 虛擬機到 systemd 並且看門狗總是超時。這是我的服務:
[Unit] Description=My Service After=docker.service Requires=docker.service StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 WatchdogSec=190 TimeoutStartSec=0 NotifyAccess=all User=root WorkingDirectory=/root ExecStartPre=-/usr/bin/docker stop my-container ExecStartPre=-/usr/bin/docker rm my-container ExecStartPre=-/bin/bash docker_build.sh ExecStart=/bin/bash docker_start.sh [Install] WantedBy=multi-user.target
我使用以下方法啟動容器:
docker run -t --name my-container --privileged my-service
我的 dockerfile 看起來像這樣:
FROM python:3.6.9 # Open MQTT and HTTPS ports EXPOSE 443 8883 COPY requirements.txt requirements.txt RUN python -m pip install -U -r requirements.txt CMD python -u -m service_module
輸出:
May 05 13:31:55 DIET bash[11155]: [SO][Build Date]: 0.1-V-20200122h13:09 May 05 13:31:55 DIET bash[11155]: [SYS][INFO][17:31:55]: Serial port opened on: /dev/ttyS1 May 05 13:31:56 DIET bash[11155]: [GOOGLE][INFO][17:31:56]: Sent message: {'ip': ['x'], 'versions': {}, 'temperature': 37.793, 'cpu': 15.1, 'memory': 47.7, 'net': {'out': 7.95, 'in': 95.587}} May 05 13:33:37 DIET systemd[1]: my.service: Watchdog timeout (limit 3min 10s)! May 05 13:33:37 DIET systemd[1]: my.service: Killing process 11155 (bash) with signal SIGABRT. May 05 13:33:37 DIET systemd[1]: my.service: Killing process 11157 (docker) with signal SIGABRT. May 05 13:33:37 DIET systemd[1]: my.service: Main process exited, code=killed, status=6/ABRT May 05 13:34:53 DIET bash[11155]: [GOOGLE][INFO][17:34:53]: Sent message: {'ip': ['x'], 'versions': {}, 'temperature': 33.916, 'cpu': 0.9, 'memory': 47.8, 'net': {'out': 9.882, 'in': 6.336}}
當 '
$$ GOOGLE $$$$ INFO $$’ 行顯示。第一個和超時之間只有大約 2 分鐘,這意味著它永遠不會被重置。提前致謝 ! **編輯:**在 docker 之外執行此服務可以正常工作。
我已經使用sdnotify-proxy修復了它。我為此更改了啟動命令:
/usr/local/bin/sdnotify-proxy /run/my-sd.sock \ /usr/bin/docker run -t --name my-container --volume /run/my-sd.sock:/run/my-sd.sock \ --env NOTIFY_SOCKET=/run/my-sd.sock --privileged my