У меня нет времени, чтобы проверить это, но как насчет trap - Я сейчас в АФК, но когда я войду, я отредактирую этот ответ после некоторых экспериментов?
К вашему сведению, я не знаю, какие сигналы посылаются, когда контейнер уничтожается, я не смотрю на это, поэтому этот ответ основан на том, что они выводятся из эксплуатации таким же образом, как и обычная машина Linux.
В вашем обработчике вы добавили бы команду оболочки, которая запускает этот скрипт, а затем установили переменную, которая будет оставаться на месте, пока контейнер используется повторно - я не питон, но ваша логика могла бы что-то сделать как это:
Обработчик
const { exec } = require('child_process');
if(typeof isNewContainer === 'undefined'){
const isNewContainer = true
// run a shell script, in javascript we use shell exec and
// then have a callback for when it exits so the execution is non blocking and allows
// the code below to execute.
exec('./script.sh & sleep 1 && kill -- -$(pgrep script.sh)', (err, stdout, stderr) => {
// close db connections
}
}
// handle the request
Сценарий оболочки на основе этого ответа:
#!/bin/bash
exitCallback() {
trap - SIGTERM # clear the trap
kill -- -$$ # Sends SIGTERM to child/sub processes
}
trap exitCallback SIGTERM
sleep infinity
Убедитесь, что вы прочитали комментарии к принятому ответу на этот вопрос, поскольку он дает вам команды оболочки для запуска сценария.
Я бы сказал, что поддерживать контейнеры в тепле довольно просто, но ваш вопрос был таков: "Есть ли в Python способ определить, пытается ли Lambda уничтожить мой экземпляр функции (возможно, они посылают сигнал SIGTERM?) И закрыть ли он активную базу данных?" соединения? "