Ubuntu

Systemd 服務(呼叫 sh 腳本作為服務) - 如何獲取更新狀態

  • May 6, 2021

我有以下工作 systemctlsystemd啟動腳本,它會在重新啟動時完美自動啟動(其他 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'.

在我的情況下,我的腳本可以通過僅在 whenExecStartPostExecStopPostexecutes時提供額外的輸入參數來稍微調整。

僅針對這些命令的額外輸入參數:

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單元”都需要額外的工作。

引用自:https://unix.stackexchange.com/questions/648216