시스템 서비스(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각 "스크립트 유형 단위"에 대한 추가 작업을 의미합니다.

관련 정보