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 ::没有这样的文件或目录