У меня есть сценарий, где у меня есть сценарий оболочки, который запускается с использованием crond
.Мне нужно выйти из контейнера, если этот конкретный скрипт не удается.Похоже, SIGKILL
не работает с PID 1.
Как убить процесс контейнера (PID 1) изнутри контейнера с помощью оболочки bash / sh?
Минимальный пример -
Dockerfile -
FROM alpine:3.5
ENV LOGS_DIR="/rest/logs/" CRON_LOG_FILE="${LOGS_DIR}/cron.log"
RUN apk add --update python py-pip zip bash && \
pip install awscli && \
mkdir -p ${LOGS_DIR} && \
touch ${CRON_LOG_FILE}
COPY ./lr-s3.sh ./lr-entry.sh ./install_crontab.txt ./files_to_rotate.txt ./
RUN chmod +x /lr-s3.sh /lr-entry.sh && \
crontab install_crontab.txt
ENTRYPOINT ["/lr-entry.sh"]
Точка входа -
#!/bin/bash
LOGS_DIR="${LOGS_DIR:-/rest/logs}"
CRON_LOG_FILE="${LOGS_DIR}/cron.log"
mkdir -p ${LOGS_DIR}
touch ${CRON_LOG_FILE}
ln -sf /proc/1/fd/1 ${CRON_LOG_FILE}
echo "Cron [Starting]"
exec crond -c /var/spool/cron/crontabs -f -L ${CRON_LOG_FILE} "$@"
Скрипт для запуска через Cron -
aws s3 cp ${LOGS_DIR}/${FL_NAME} s3://${BKTNAME}/${FL_NAME}
if [ "$?" -ne "0" ]; then
echo "S3 Backup Failed"
pkill crond
exit 1
fi
pkill crond
внутри не работаетсценарий имеет PID 1.
Если контейнер перезапускается или не существует, мы узнаем, что существует проблема с контейнером или сценарием.