Airflow Scheduler 无法通过 WSL 执行 Windows EXE

2023-12-27

我的 Windows 10 计算机在 WSL 2 (Ubuntu-20.04) 中安装了 Airflow 1.10.11。

我有一个 BashOperator 任务,它在 Windows 上调用 .EXE(通过 /mnt/c/... 或通过符号链接)。 任务失败。日志显示:

[2020-12-16 18:34:11,833] {bash_operator.py:134} INFO - Temporary script location: /tmp/airflowtmp2gz6d79p/download.legacyFilesnihvszli
[2020-12-16 18:34:11,833] {bash_operator.py:146} INFO - Running command: /mnt/c/Windows/py.exe
[2020-12-16 18:34:11,836] {bash_operator.py:153} INFO - Output:
[2020-12-16 18:34:11,840] {bash_operator.py:159} INFO - Command exited with return code 1
[2020-12-16 18:34:11,843] {taskinstance.py:1150} ERROR - Bash command failed
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/airflow/models/taskinstance.py", line 984, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/usr/local/lib/python3.8/dist-packages/airflow/operators/bash_operator.py", line 165, in execute
    raise AirflowException("Bash command failed")
airflow.exceptions.AirflowException: Bash command failed
[2020-12-16 18:34:11,844] {taskinstance.py:1187} INFO - Marking task as FAILED. dag_id=test-dag, task_id=download.files, execution_date=20201216T043701, start_date=20201216T073411, end_date=20201216T073411

就是这样。返回码1没有进一步有用的信息。

通过 bash 运行相同的 EXE 工作完美,没有错误(我也在我自己的程序上尝试过,它向控制台发出一些东西 - 在 bash 中它发出得很好,但是通过airflow scheduler这是同样的错误1)。

我为排除任何其他问题所做的更多数据和操作:

  • airflow scheduler以 root 身份运行。我还确认它正在运行root上下文通过放置whoami我的 BashOperator 中的命令,确实发出了root(我还应该注意到,所有本机 Linux 程序都运行得很好!只有 Windows 程序不行。)
  • 我尝试执行的 Windows EXE 及其目录具有完全的“所有人”权限(当然,在我自己的程序上,不敢在我的 Windows 文件夹上执行此操作 - 这只是一个示例。)
  • 通过 /mnt/c 以及通过符号链接访问时都会发生故障。对于符号链接,符号链接具有 777 权限。
  • 我尝试跑步airflow test在 BashOperator 任务上 - 它运行完美 - 将输出发送到控制台并返回 0(成功)。
  • 尝试使用各种 EXE 文件 - 包括“本机”文件(例如 Windows 附带的文件)以及我的 C# 制作的程序。所有人的行为都是一样的。
  • 在 Airflow 的 GitHub 存储库和 Stack Overflow 中都没有发现任何类似的问题。

问题是:Airflow 对子进程(airflow 调度程序用来运行 Bash Operators)的 Python 使用与“正常”Bash 有何不同,从而导致error 1?


您可以使用Python和PowerShell的库subprocess和sys

在 Airflow > Dags 文件夹中,创建 2 个文件:main.py 和 caller.py

所以,main.py调用caller.py,caller.py进入机器(Windows)运行文件或例程。

这是过程:

代码Main.py:

# Importing the libraries we are going to use in this example
from airflow import DAG
from datetime import datetime, timedelta
from airflow.operators.bash_operator import BashOperator


# Defining some basic arguments
default_args = {
   'owner': 'your_name_here',
   'depends_on_past': False,
   'start_date': datetime(2019, 1, 1),
   'retries': 0,
   }


# Naming the DAG and defining when it will run (you can also use arguments in Crontab if you want the DAG to run for example every day at 8 am)
with DAG(
       'Main',
       schedule_interval=timedelta(minutes=1),
       catchup=False,
       default_args=default_args
       ) as dag:

# Defining the tasks that the DAG will perform, in this case the execution of two Python programs, calling their execution by bash commands
    t1 = BashOperator(
       task_id='caller',
       bash_command="""
       cd /home/[Your_Users_Name]/airflow/dags/
       python3 Caller.py
       """)

    # copy t1, paste, rename t1 to t2 and call file.py
    
# Defining the execution pattern
    t1

    # comment: t1 execute and call t2
    # t1 >> t2

代码调用者.py

import subprocess, sys

p = subprocess.Popen(["powershell.exe"
                     ,"cd C:\\Users\\[Your_Users_Name]\\Desktop; python file.py"] # file .py
                    #,"cd C:\\Users\\[Your_Users_Name]\\Desktop; .\file.html"]    # file .html
                    #,"cd C:\\Users\\[Your_Users_Name]\\Desktop; .\file.bat"]     # file .bat
                    #,"cd C:\\Users\\[Your_Users_Name]\\Desktop; .\file.exe"]     # file .exe
                    , stdout=sys.stdout
                     )

p.communicate()

如何知道你的代码是否可以在气流中运行,如果运行,就可以了。

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

Airflow Scheduler 无法通过 WSL 执行 Windows EXE 的相关文章

随机推荐

  • 通过打开包含内容的文本编辑器来捕获用户输入

    从 bash 脚本中 我想 打开当前用户的默认文本编辑器 粘贴字符串 original content in it 一旦用户修改内容然后关闭文本编辑器 将修改后的字符串捕获到变量中 modified content 然后保存 modifie
  • 我是否可以在前向声明中默认模板参数

    所以我试图了解 Boost 发生了什么ptree执行 在ptree hpp中basic ptree实际上定义为 template
  • 在 VBA 中从 IEEE-754 双精度数中提取尾数、指数和符号数据

    如何在 VBA 中从 IEEE 754 64 位 双精度 浮点数中提取尾数 指数和符号数据 谢谢 Edit 约翰科尔曼评论后 在发布原始问题之前 我已经四处寻找解决方案 但只能找到如何在 C 中执行此操作 例如使用具有位字段的结构 找不到
  • 我可以更改 PHP 接受的扩展吗?

    我想接受包含 PHP 代码的其他类型的文件 例如 如果通过 PHP 读取 aspx 文件 就像它是 php 一样 那就太好了 将其添加到 Apache 中的 htaccess 文件中 以使 html 解析为 PHP AddType appl
  • 将数据从一个 hbase 表复制到另一个 hbase 表

    我创建了一个表 hivetest 它还在 hbase 中创建了名为 hbasetest 的表 现在我想将 hbasetest 数据复制到具有相同架构的另一个 hbase 表 例如 logdata 中 那么 任何人都可以帮助我如何在不使用配置
  • 环境变量和@Value不能在Spring Boot上一起工作

    我有一个 Spring boot 应用程序 它连接到用作缓存的 Redis 实例 当我在开发环境中时 我有以下内容 spring profiles default redis host localhost port 6379 而我的缓存配置
  • 如何使用Firebug或其他查看WS/WSS Websocket请求内容?

    有没有办法查看Websocket流量 首次握手时仅可见 Websocket 标头 响应后一切都消失了 Connection Upgrade Sec WebSocket Accept EQqklpK6bzlgAAOL2EFX nx8bEI U
  • 在asp.net中动态添加

    标签用于评论系统

    我正在为我的网页制作一个评论框 我设计了一个表单来获取用户名和评论并将其存储在数据库表中 我不知道如何在页面上呈现该数据 通过迭代表格并随后在页面上创建段落或在页面上创建标签 我在 C 中使用 LINQ to SQL 请告诉我如何在网页或教
  • 带子图的猫图有限制吗? [复制]

    这个问题在这里已经有答案了 Seaborn 的 catplot 似乎无法与 plt subplots 一起使用 我不确定这里有什么问题 但我似乎无法将它们并排放置 Graph 1 plt subplot 121 sns catplot x
  • 清理数组

    我有一个动态生成的表单 最终用户将能够向数据库提交员工详细信息 因此数组 fname 将包含所有名字 lname 将包含所有姓氏等 然后将数组插入到 MySQL 中 如下所示 query INSERT INTO workers date a
  • 打印空行有什么作用?

    我知道这个问题很可能是您今天听到的最愚蠢的问题 但对我来说 这是我编程学习现阶段的一个大问题 为什么这段 Python 代码中需要第二个空行 那条线有什么作用 print Content Type text plain print prin
  • 我可以在 tmux 中双击选择并复制吗?

    我正在学习使用 tmux 我发现当我在 tmux 窗口中时 双击选择和复制功能不再起作用 我可以像 iterm2 一样使用双击来选择和复制吗 我用谷歌搜索了一段时间 但没有找到简短而明确的答案 我已经添加了setw g mode mouse
  • 按地址获取符号(符号二进制,iOS 构建)

    我有分配工具的快照 其中包含有趣符号的地址 我想知道这个地址在代码中的位置 我有相应的 dSYM 文件 我尝试使用atosym命令行工具 但它给了我错误的符号 与我的应用程序无关 如何获得 PS 二进制文件由XCode 4 3 2构建 代码
  • ./deploy.sh 不适用于 gitlab ci

    我的问题是我创建的 bash 脚本出现此错误 bin sh eval 第 88 行 deploy sh 未找到 在 gitlab 上 下面是我的示例脚本 gitlab ci yml 我怀疑 gitlab ci 不支持 bash 脚本 ima
  • Python 中的正则表达式用于检测整数、浮点数或科学记数法中的数字

    如何在 Python 中创建接受数字的正则表达式 这些数字可以是整数 浮点数 也可以是 3e 3 或 3e 3 格式 我只想匹配字符串的开头 如果存在上述任何格式的数字 则返回该数字和字符串的其余部分 Edit 例如 输入 gt gt 29
  • PHP、Javascript 和 SQL 代码混淆

    您好 我有这段代码可以从数据库中提取客户名称和地址 它回显下拉列表中每个条目的客户端名称
  • 无法通过 Android 应用程序正确加载 Facebook 页面

    我想通过我的 Android 应用程序单击按钮打开我的 Facebook 页面 我目前正在使用以下代码 如此处所回答 从 Android 应用程序打开 Facebook 页面 https stackoverflow com question
  • 实体框架 6.1 中的模拟 DbContext

    我发现了许多示例 显然 显示了使用 EF 6 模拟 DbContext 的清晰工作示例 但是 它们似乎都不适合我 我也不完全确定原因 这是我设置模拟的单元测试代码 var mockData new List
  • 学习 Smalltalk 最好的免费 IDE 是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 您认为学习 SmallTalk 的好 IDE 是什么 我只是将它用作业余爱好 所以它必须是免费的 你还应该考虑Pharo http pha
  • Airflow Scheduler 无法通过 WSL 执行 Windows EXE

    我的 Windows 10 计算机在 WSL 2 Ubuntu 20 04 中安装了 Airflow 1 10 11 我有一个 BashOperator 任务 它在 Windows 上调用 EXE 通过 mnt c 或通过符号链接 任务失败