独立于AWS Lambda函数的Python子进程

2023-11-22

我已成功创建一个读取和写入 RDS 的 Lambda 函数 (app1)。

我的Lambda函数是用python2.7编写的,并作为压缩包上传。

我在与 RDS 和 Lambda 函数相同的 VPC 中的 EC2 实例上创建并测试了压缩包。

接下来,我向 Lambda 函数添​​加了使用 subprocess.popen 弹出独立子进程 (app2) 的功能,并让 app1 返回,而 app2 子进程继续自行运行。我测试了 app1 将成功返回其处理程序的输出,而 app2 通过在 app2 中放置 60 秒睡眠并跟踪 app2 的输出文件来继续。

我在 EC2 实例中成功测试了 app1 和 app2 功能。

上传新包后,我的 app1 的行为似乎与预期完全一致,并立即返回其处理程序的输出,但 app2 功能并未“出现”实例化,但没有日志、错误或可从 app2 捕获的输出。

在 app1 中,我通过在独立的 subprocess.popen 之前和之后执行 subprocess.check_output(['ls','-la']) 来测试子进程的工作情况,并且本地文件夹与我的文件一起显示。除非没有按预期创建 app2output 文件。

两个问题

  1. AWS-Lambda 概念中我缺少什么特别的东西吗 这导致app2“失败”?我所说的“失败”是指不写入创建新文件并写入该文件,也不像 app1 成功那样在 Cloudwatch 中创建任何日志,也不像 app1 那样打印到 Lambda 控制台。
  2. 如何在 AWS-Lambda 环境中捕获 app2 的任何输出(日志记录信息和错误)?

app1.py

import subprocess
import sys
import logging
import rds_config
import pymysql
#rds settings
rds_host  = "rdshost"
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name
port = 3306

logger = logging.getLogger()
logger.setLevel(logging.INFO)

server_address = (rds_host, port)
try:
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except:
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
    sys.exit()

def handler(event, context):

    cur = conn.cursor()
    isql = "INSERT ..."
    cur.execute(isql)
    conn.commit()
    newid = cur.lastrowid
    cur.close()

    args = [str(newid),str(event['name'])]

    logger.info('ARGS: '+str(args))
    print 'pwd: '
    output = subprocess.check_output(['pwd'])
    print output
    print 'ls -la'
    output = subprocess.check_output(['ls','-l'])
    print output

    pid = subprocess.Popen([sys.executable, "app2.py"]+args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

    logger.info('PID: '+str(pid))
    output = subprocess.check_output(['ls','-l'])
    print output

    return "{'status':'success','newid':'"+str(newid)+"'}";

app1.py 中“logger.info('PID: '+str(pid))”的输出

就像:“PID:

app2

import sys
import logging
from datetime import datetime
import time

fo = open('app2output','a+')
fo.write("starting with: "+str(sys.argv)+"\n")

logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.info("Starting with: "+str(sys.argv)+"\n")

#log accumulated processing time
t1 = datetime.now();
sleep(60)
t2 = datetime.now();
tstring = "{'t1':'"+str(t1)+"','t2':'"+str(t2)+"','args':'"+str(sys.argv[1])+"'}"
logger.info(tstring+"\n")
fo.write(tstring+"\n")
fo.close()
sys.exit()

处理函数返回后,AWS Lambda 环境将立即终止。处理程序函数完成后,您无法在 AWS Lambda 环境中在后台运行子流程。您需要编写 Lambda 函数代码以等待子流程完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

独立于AWS Lambda函数的Python子进程 的相关文章

随机推荐

  • 我使用的是哪个版本的 Kohana?

    Kohana框架中哪里可以找到版本信息 我在教程中看到的所有内容都与我在应用程序中看到的内容相反 我认为这是一个版本问题 因为文档和我的安装之间的方法和调用略有不同 至少对于 gt 3 0 的版本 Kohana 的版本号位于system c
  • Applescript 右键单击​​文件

    苹果脚本中是否有一个命令可以右键单击文件并调出上下文菜单 我正在寻找类似的东西 tell application Finder set theDesktopItems to every item of desktop right click
  • 如何逃脱液体模板标签?

    这听起来很简单 但是我在文档中找不到它 我怎样才能写 this in a liquid模板 未经引擎处理 可以使用以下命令禁用液体处理引擎raw tag raw this endraw 将显示 this
  • 将 Node.js 应用程序(托管在 GAE 上)的 IP 列入白名单以访问 MongoDB Atlas(托管在 GCP 上)

    我希望我的后端服务器 Node js 托管在 Google App Engine 上 灵活的环境 如果重要的话 能够从我的数据库 MongoDB 通过 Atlas 也托管在同一区域的 Google Cloud 平台上 获取和传递数据作为我的
  • 如何配置 flot 以在 y 轴零点处绘制缺失的时间序列?

    我正在使用浮点 github上的浮动 用以下时间序列数据绘制图表 1357171200000 1 1357344000000 1 1357430400000 2 1357516800000 2 1357689600000 3 1357776
  • 如何在Magento中连接多个外部数据库? [关闭]

    Closed 这个问题是无关 目前不接受答案 我需要从 Magento 连接到一些外部数据库 我找到了一个教程在 Magento 中创建外部数据库连接 本教程很有帮助 它适用于连接到一个外部数据库 但是 我必须连接多个外部数据库 如何在 M
  • django.core.paginator 使用 jQuery 进行 Ajax 分页

    Problem 我需要在 Django 模板中使用 jQuery 进行 Ajax 分页 情况 我的模板中有以下代码 code omitted table table
  • PHP spl_自动加载

    我真的没有得到 spl autoload 的文档 bool spl autoload register callback autoload function 根据我的理解 当 php 遇到尚未加载的类时 它将尝试运行注册的函数 例如 pub
  • 我可以使用 open_basedir 访问 /dev/urandom 吗?

    我想在 Codeigniter 中使用 phpass 0 3 但由于以下原因出现以下错误open basedir 遇到 PHP 错误严重性 警告消息 is 可读 函数 可读 open basedir 限制生效 文件 dev urandom
  • 为什么 Google API V3 不返回子级?

    我想使用 Python 获取 Google Drive 中给定文件夹中的所有文件 文件夹的列表 我正在使用的调用是这样的 query parentID in parents response service files list q que
  • 自定义创建的方法错误:“不是函数”

    我有一个英雄按钮列表 其中创建了自定义动画button component ts 一开始 他们是不活跃的 当我按下其中之一时 所选的应该变为活动状态 为此 我创建了一个字段hero ts called state和一个名为的函数toggle
  • 使用 css 按对角线分割双色调背景

    我正在尝试使用 css 创建一个背景 其中一侧是纯色 另一侧是纹理 两者被对角线分开 我希望这是 2 个独立的 div 因为我计划使用 jQuery 添加一些动作 如果您单击右侧 灰色三角形会变小 如果您单击左侧 纹理三角形会变小 就像窗帘
  • Safari 为 Silverlight (NPAPI) 计划的生命周期是怎样的

    Chrome 已经放弃了 NPAPI silverlight 支持 Firefox 宣布将于 2016 年底停止对 NPAPI 支持 https blog mozilla org futurereleases 2015 10 08 npap
  • 如何从 MSI“文件”表中提取数据(文件计数)

    在我们的构建过程中 当前有可能将基于非代码的文件 例如图像文件 添加到我们的 Web 项目中 但不包含在 WiX 构建的 MSI 安装程序中 为了帮助防止这种情况 我想在 WiX 项目的 AfterBuild 目标中执行以下操作 获取所有已
  • 在 UWP Xaml 中创建并填充 NxN 网格

    我正在尝试创建一个UWP益智游戏 我想将图片切成n个部分 然后在网格中显示这些部分 我的问题是 如何强制某种 NxN 风格 现在我必须最大化窗口才能看到 3x3 网格 如果我缩小任一侧 它将收敛到 2 列 1 列网格 有办法处理这个问题吗
  • Ionic 4 Angular 路由器导航并清除上一页的堆栈/历史记录

    我正在使用 Ionic 4 和 Angular 路由器开发一个应用程序 我想导航到另一个页面并清除页面堆栈 在 Android 原生中 它是这样的 Intent intent new Intent NewActivity this Main
  • 带有 attr_accessor 的类上的 Ruby instance_eval

    我了解之间的基本区别instance eval and class eval 但我在玩的时候发现了一些奇怪的事情attr accessor 这是一个例子 A Class new A class eval attr accessor x a
  • 如何在 Markdown 中为 PDF 文档添加图像作为页眉/页脚

    我想将图像作为页眉和页脚 与我的组织的视觉标识保持一致 添加到 PDF 报告中 我已经设法在 Sweave 中做到这一点 但我也希望能够仅使用 Markdown 来做到这一点 我可以使用插入图像 footer H R Footer pdf
  • C# .NET - 固定证书颁发机构 - 我做得正确吗?

    我的软件使用 HTTPS 连接连接到 Dropbox 以检索一些敏感数据 我想固定证书颁发机构以防止中间人攻击 到目前为止我有以下代码 static bool VerifyServerCertificate object sender X5
  • 独立于AWS Lambda函数的Python子进程

    我已成功创建一个读取和写入 RDS 的 Lambda 函数 app1 我的Lambda函数是用python2 7编写的 并作为压缩包上传 我在与 RDS 和 Lambda 函数相同的 VPC 中的 EC2 实例上创建并测试了压缩包 接下来