簡體   English   中英

我如何使用bash / sh shell從容器內部殺死容器進程(PID 1)

[英]How do I kill the container process (PID 1) from inside the container using bash/sh shell

我有一個場景,其中有一個使用crond運行的shell腳本。 如果該特定腳本失敗,則需要退出容器。 似乎SIGKILL不適用於PID 1。

如何使用bash / sh shell從容器內部殺死容器進程(PID 1)?

最小的例子-

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。

如果容器重新啟動或不存在,我們將知道容器或腳本存在問題。

如何使用bash / sh shell從容器內部殺死容器進程(PID 1)?

PID 1受保護,因此您不能殺死它,但是可以為其設置信號處理程序:

 # somewhere in entrypoint
 trap "exit" SIGINT SIGTERM

之后,如果您從容器內的另一個進程發送了kill -s SIGINT 1 ,則該進程將exit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM