Как убить процесс контейнера (PID 1) изнутри контейнера с помощью оболочки bash / sh - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть сценарий, где у меня есть сценарий оболочки, который запускается с использованием 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.

Если контейнер перезапускается или не существует, мы узнаем, что существует проблема с контейнером или сценарием.

1 Ответ

0 голосов
/ 20 декабря 2018

Как убить процесс контейнера (PID 1) изнутри контейнера, используя оболочку bash / sh?

PID 1 защищен, поэтому вы не можете его убить, нодля него можно настроить обработчик сигнала:

 # somewhere in entrypoint
 trap "exit" SIGINT SIGTERM

, после этого процесс будет exit, если вы отправили kill -s SIGINT 1 из другого процесса внутри контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...