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