![](/img/trans.png)
[英]How do you signal a process (PID) to restart in the same shell where it is running, from another shell using bash?
[英]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.