簡體   English   中英

Docker在X時間后殺死了一個容器中的無限進程

[英]Docker kill an infinite process in a container after X amount of time

我正在使用此Docker 問題中找到的代碼來基本上啟動一個容器在20秒內運行一個進程,如果該過程完成 / 未完成 / 執行失敗 / 超時 ,則無論如何該容器都會被殺死。

我當前使用的代碼是這樣的:

#!/bin/bash
set -e

to=$1
shift

cont=$(docker run -d "$@")
code=$(timeout "$to" docker wait "$cont" || true)
docker kill $cont &> /dev/null
echo -n 'status: '
if [ -z "$code" ]; then
    echo timeout
else
    echo exited: $code
fi

echo output:
# pipe to sed simply for pretty nice indentation
docker logs $cont | sed 's/^/\t/'

docker rm $cont &> /dev/null

但是,如果您運行無限進程(例如此python無限循環),那幾乎是完美的:

while True:
    print "inifinte loop"

閱讀了片刻后,我認為整個系統都卡了,應用程序崩潰了,我認為這與STDOUT Buffer有關,但我絕對不知道那是什么意思?

請在cont = $(docker run -d“ $ @”)結尾處添加&

它將在后台運行該過程。

我不知道dockers,但如果仍然無法停止,您也可以在此行之后添加以下內容:

mypid = $! 睡覺20 &&殺死$ mypid

問候

您遇到的問題是正在將大量數據寫入stdout的進程。 這些消息記錄到一個無限增長的文件中 看一下(取決於您的系統日志文件的位置):

sudo find /var/lib/docker/containers/ -name '*.log' -ls

您可以刪除舊的日志文件(如果它們不重要)。 一種可能性是在文件最大大小的ulimit限制下啟動docker run -d守護程序。 添加到腳本的開頭,例如:

ulimit -f 20000 -c 0

這將文件大小限制為20000 * 1024字節,並禁用了核心文件轉儲,這是您期望從強制寫入失敗的無限循環中獲得的。

暫無
暫無

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

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