Bash 操作员错误:气流中没有这样的文件或目录

Posted

技术标签:

【中文标题】Bash 操作员错误:气流中没有这样的文件或目录【英文标题】:Bash Operator error: No such file or directory in airflow 【发布时间】:2019-04-05 14:11:04 【问题描述】:

我是 Airflow 的新手,正在努力使用 BashOperator。我想在我的 dag.py 中使用 bash 操作符访问 shell 脚本。

我检查了: How to run bash script file in Airflow 和 BashOperator doen't run bash file apache airflow

关于如何通过 bash 操作符访问 shell 脚本。

这就是我所做的:

 cmd = "./myfirstdag/dag/lib/script.sh "

        t_1 = BashOperator(
            task_id='start',
            bash_command=cmd
        )

在运行我的食谱并检查气流时,我收到以下错误:

[2018-11-01 10:44:05,078] bash_operator.py:77 INFO - /tmp/airflowtmp7VmPci/startUDmFWW: line 1: ./myfirstdag/dag/lib/script.sh: No such file or directory
[2018-11-01 10:44:05,082] bash_operator.py:80 INFO - Command exited with return code 127
[2018-11-01 10:44:05,083] models.py:1361 ERROR - Bash command failed

不知道为什么会这样。任何帮助将不胜感激。

谢谢!

编辑注意:我假设它在某些气流 tmp 位置而不是我提供的路径中搜索。但是如何让它搜索正确的路径。

【问题讨论】:

./myfirstdag/dag/lib/script.sh 是否相对于 $AIRFLOW_HOME/dags 目录? @SergiyKolesnikov 不,不是。 /myfirstdag/dag/lib/ 是不同的路径,而 $AIRFLOW_HOME 在我尝试时给出了不同的路径。 那么script.sh绝对路径是什么? @SergiyKolesnikov 这个 /home/notebook/work/myfirstdag/dag/lib/ 。我也试过给这个。它会引发同样的错误。 显然,它正在创建的 tmp 目录中进行搜索。这就是我从源代码中理解的。 github.com/apache/incubator-airflow/blob/… 。不知道如何让它在我给的路径中搜索。 【参考方案1】:

试试这个:

bash_operator = BashOperator(
    task_id = 'task',
    bash_command = '$AIRFLOW_HOME/myfirstdag/dag/lib/script.sh '
    dag = your_dag)

【讨论】:

您好,感谢您回答这个问题!您能否提供一些详细信息,此代码如何解决问题? :) 这解决了我的问题!如果我更改 bash_command 以在最后合并额外的空间以适应 jinja 错误,我总是会得到一个未找到脚本的错误。使用 env 变量解决了这个问题,谢谢!【参考方案2】:

尝试运行这个:

path = "/home/notebook/work/myfirstdag/dag/lib/script.sh"
copy_script_cmd = 'cp ' + path + ' .;'
execute_cmd = './script.sh'

t_1 = BashOperator(
    task_id='start',
    bash_command=copy_script_cmd + execute_cmd
)

【讨论】:

【参考方案3】:

对于那些运行 docker 版本的人。

我遇到了同样的问题,我花了一段时间才意识到这个问题,docker 的行为可能会有所不同。当 DAG 运行时,它会移动它的 tmp 文件,如果 docker 上没有气流,则它在同一台机器上。使用我的 docker 版本,它会将其移动到另一个容器中运行,当然当它运行时不会打开脚本文件。

仔细检查任务日志,您会看到在任务运行之前发生了这种情况。 这也可能取决于您的气流泊坞窗设置。

【讨论】:

我只使用 docker 版本。你是怎么解决这个问题的?【参考方案4】:

你确定你定义的路径吗?

cmd = "./myfirstdag/dag/lib/script.sh "

带有标题表示它是相对于您执行命令的路径。

你能试试这个吗?

cmd = "find . -type f"

【讨论】:

我试过不带 .也。它给出了同样的错误。 尝试设置 cmd="pwd" 并在相应目录中给我们一个 find - ls 的输出? 我已经试过了。它提供了一个 tmp 目录,该目录在每次运行后都会被删除。但我不确定如何将路径设置为我的脚本所在的路径。 好了,把find -ls作为自己的cmd,我们看看myfirstdag/dag/lib/script.sh在哪里 似乎无法使用 find 命令找到它。这是因为它找不到目录本身。所以我做了cd /home ; ls -lrt。我得到的只是一个文件夹airflow/,其中我还有另外两个文件夹,分别名为example/notebook/,当我通过bashOperator 执行此操作时没有显示。我得到的只是:Running command: cd / ; cd home/; ls Output: airflow【参考方案5】:

试试下面的。它需要有一个完整的 bash 文件路径。

cmd = "/home/notebook/work/myfirstdag/dag/lib/script.sh "

t_1 = BashOperator(
    task_id='start',
    bash_command=cmd
)

【讨论】:

已经试过了。不工作。请参考上面的cmets。 您能否为了调试,尝试删除.sh 扩展名并使用cmd=bash /home/notebook/work/myfirstdag/dag/lib/script 运行,让我知道它是否有效。

以上是关于Bash 操作员错误:气流中没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

docker env: bash\r: 没有这样的文件或目录

.bash_PROFILE:Mac终端中没有这样的文件或目录

-bash:/ bin / bash ::没有这样的文件或目录

如何避免此错误运行maven时没有这样的文件或目录

bash:scripts/mysql_install_db: 没有这样的文件或目录

Linux下运行bash脚本显示“: /usr/bin/env: "bash ": 没有那个文件或目录