システムサービス(shスクリプトをサービスとして呼び出す) - 更新された状態を取得する方法

システムサービス(shスクリプトをサービスとして呼び出す) - 更新された状態を取得する方法

systemd再起動時に完全に機能し、自動的に起動する次のsystemctl起動スクリプトがあります(他のdbdeployerの依存関係も起動します)。

.sh script基本的に呼び出されるサービスについて、ここにいくつかの異なる「状態」を作成しました。

(スタートスクリプトはドッカーが書いたプロジェクトであり、もう一つはdbdeployer mysqlインスタンス)

システム化されたサービスユニットドッカー作成コンテナ:

[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正しい出力が提供されることを望んでいます($(which docker-compose) psつまり、遅延があります。Dockerコンテナには約3〜10秒かかることがあるため、この状態はコマンドが呼び出されるたびに更新(再クエリ)されません。)status、ソースが発生した場合にのみ出力が表示されますExecStartPost

要約すると、これを行うと、systemctl status docker-compose-mag235.service一部のドッカーコンテナがまだexit/starting生きていることを示す出力が表示されます。

質問

systemctl status docker-compose-mage235.service私に以下を提供するために使用できる方法(またはそれに対応するsystemctlコマンド)がありますか?アップデートステータス。 _つまり、$(which docker-compose) psこの新しいsystemctlコマンドを実行したときの状態です。

(これらの起動システムサービスを作成する前に、常に各呼び出しがステータスを「再クエリ」すると仮定していましたが、ログファイルから最後の出力のみを取得することに気づきました(おそらくsyslog)。

メモ:

呼び出し/location/of/project/file/of/docker-compose.ymlは可能ですが、Docker Composeプロジェクトに基づいてクエリできるさまざまなクエリに対応したいと思いますsystemd services。つまり、さまざまなDCプロジェクト用の複数のフォルダがあります。その後、エイリアスを作成する必要があります。そうする前に、これが役に立つsystemdかどうかがわかります。

答え1

docker-composeいいえ、systemdのログに追加情報を送信できない場合は不可能です。

systemctl statusサービスステータスとそのサービスの最新のジャーナルエントリを表示します。

を実行すると、より多くのログエントリを表示できますjournalctl -b0 -p 0..7 -u docker-compose。これにより、最後に再起動した後のすべてのdocker-composeログエントリが提供されます。

答え2

「アップデートステータス」を直接取得できないことを指摘した@casに感謝しますsystemd。彼は私にそれを指摘し、次のように提案しました。

ExecStartPostスクリプトが完了する前にすべてが正しく開始されたこと(各チェックの間に1〜2秒以上のスリープモードを含む)を繰り返しチェックする理由はありません。ログログにさらにステータス情報を出力できますか?わかりません...多分STDERRで印刷することができます。

これはスクリプトを遅らせることができるという事実に気づきました。これは元の目標ですsystemd 'somestatuscommand-that-queries'

私の場合は、追加の入力パラメータを指定してスクリプトを少し調整できます。場合ExecStartPostのみExecStopPost実行

次のコマンドでのみ使用できる追加の入力パラメータ:

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各「スクリプトタイプ単位」の追加作業を意味します。

関連情報