Systemd 服務(呼叫 sh 腳本作為服務) - 如何獲取更新狀態
我有以下工作 systemctl
systemd
啟動腳本,它會在重新啟動時完美自動啟動(其他 dbdeployer 依賴項也啟動)。它是
.sh script
我創建幾個不同的“狀態”的地方,基本上是為了呼叫的服務。(一個啟動腳本使用docker-compose項目,另一個用於dbdeployer mysql 實例)
用於docker-compose 容器的Systemd 服務單元:
[Unit] Description=Magento 2.3.5 Docker-Compose Containers After=dbdeployer-mysql-5-731-in-1.service Requires=docker.service dbdeployer-mysql-5-731-in-1.service [Service] EnvironmentFile=/var/www/_systemd.startups_/glolighting/magento/2_35/docker-compose.mag2.35.env.file #Environment=FILE_SCRIPT=/var/www/docker/_systemd.startups_/magento/2_35/dc-glo-mag235.sh #PassEnvironment=$DCFOLDER Type=simple TimeoutStartSec=0 Restart=always RestartSec=4s RemainAfterExit=yes #WorkingDirectory=${DC_PROJECT_FOLDER} ExecStartPre=mkdir -p ${LOGFOLDER} ExecStartPre=echo ${DC_PROJECT_FOLDER} ExecStartPre=echo Starting Docker-compose service for ${DESCRIPTION}... ExecStartPre=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 ExecStart=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 2 ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 ExecStop=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 3 ExecStopPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 [Install] WantedBy=multi-user.target
被呼叫的腳本
systemd
:____truncated for relevance___ # Continue on success if [ $arguments_correct -eq 1 ]; then cd $PATH_DOCKER_COMPOSE_PROJECT_FILE if [ $OPTION -eq 1 ]; then echo "$LINE" echo "" $(which docker-compose) ps echo "" echo "$LINE" elif [ $OPTION -eq 2 ]; then $(which docker-compose) start elif [ $OPTION -eq 3 ]; then $(which docker-compose) stop fi exit 0 fi
我希望
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
能為我提供正確的輸出,(換句話說,但有延遲 - docker 容器可能需要約 3-10 秒。所以,由於每次呼叫命令時$(which docker-compose) ps
此狀態不會更新(重新查詢) ,status
我只看到原始ExecStartPost
發生時的輸出。總結一下:一旦我這樣做
systemctl status docker-compose-mag235.service
了,我會得到輸出說一些 docker-containers 仍然是exit/starting
狀態。問題
有什麼方法可以使用
systemctl status docker-compose-mage235.service
(或等效systemctl
命令)可以給我一個更新的狀態。_換句話說:$(which docker-compose) ps
我執行這個新的 systemctl 命令時的狀態。(在創建這些啟動 systemd 服務之前,我總是假設每次呼叫的狀態都是“重新查詢”,但後來我意識到它只是從日誌文件中獲取最後一個輸出(很可能
syslog
))。筆記:
呼叫
/location/of/project/file/of/docker-compose.yml
是可能的,但我寧願只是想容納不同systemd services
的東西,我可以根據 Docker Compose 項目查詢,換句話說,我有多個文件夾用於不同的 DC 項目。然後我需要創建別名,但在我這樣做之前我會知道是否systemd
可以幫助我。
不,這是不可能的,除非你能以某種方式
docker-compose
向 systemd 的日誌發送額外的資訊。
systemctl status
顯示服務的狀態以及服務的最新日記帳分錄。您可以通過執行查看更多日誌條目
journalctl -b0 -p 0..7 -u docker-compose
。這將為您提供自上次重新啟動以來的所有 docker-compose 日誌條目。
感謝@cas 指出無法直接獲取“更新狀態”
systemd
。他指著我說:沒有理由為什麼您的 ExecStartPost 腳本不能在完成之前反複檢查一切是否正常啟動(每次檢查之間有 1 秒鐘或 2 次或更長時間的睡眠)。您是否可以將更多狀態資訊輸出到日誌日誌 - 我不知道….也許列印到 STDERR
這讓我意識到我可能只是延遲腳本,而不是我最初的目標:直接從
systemd 'somestatuscommand-that-queries'
.在我的情況下,我的腳本可以通過僅在 when
ExecStartPost
和ExecStopPost
executes時提供額外的輸入參數來稍微調整。僅針對這些命令的額外輸入參數:
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4** ExecStopPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4**
____truncated for relevance___ # Continue on success if [ $arguments_correct -eq 1 ]; then cd $PATH_DOCKER_COMPOSE_PROJECT_FILE if [ $OPTION -eq 1 ]; then if [ $sleep_correct -eq 1]; then # Sleep here when requested (and sleep input verified above) sleep $SLEEP fi #Now docker-compose ps has been given enough time to query after containers were started/stopped. echo "$LINE" echo "" $(which docker-compose) ps echo "" echo "$LINE" elif [ $OPTION -eq 2 ]; then $(which docker-compose) start elif [ $OPTION -eq 3 ]; then $(which docker-compose) stop fi exit 0 fi
不知道為什麼
systemd
沒有賦予這種能力——我假設一些重要的設計決策我現在不理解,但這意味著每個“腳本類型systemd
單元”都需要額外的工作。