Airflow BashOperator调用Shell脚本时文件找不到问题求助
问题解决步骤
1. 修正Shell脚本的路径处理逻辑
脚本运行时的工作目录并非其所在的scripts目录,因此需要通过脚本自身路径定位csv文件。修改generate_rpt.sh:
#!/bin/bash src=$1 dst=$2 file_name=$3 # 获取脚本所在的绝对目录 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 构建csv文件的绝对路径 CSV_PATH="${SCRIPT_DIR}/${file_name}" while IFS='' read -r line || [[ -n "$line" ]]; do line=${line//$';'/,} IFS=',' read -r -a columns <<< "$line" # do something with each row done < "${CSV_PATH}"
2. 修正BashOperator的参数传递
原BashOperator未将params中的参数传递给shell脚本,需在bash_command中显式传递位置参数:
execute_cmd = BashOperator( task_id="execute_cmd", # 使用脚本的绝对路径调用,避免工作目录差异导致的路径问题 bash_command="/home/airflow/gcs/dags/sus/scripts/generate_rpt.sh {{ params.src }} {{ params.dst }} {{ params.file_name }}", params={'src':'src_prj','dst':'dst_prj','file_name':'rpt_config.csv'} )
额外验证点
- 若仍报错,可在脚本开头添加
pwd和echo ${CSV_PATH}命令,输出当前工作目录和csv文件的实际路径,排查路径是否正确 - 确认Airflow Worker对
/home/airflow/gcs/dags/sus/scripts/rpt_config.csv有读取权限(gcloud shell能正常运行则权限通常无问题)
内容的提问来源于stack exchange,提问作者VKarthik
相关产品推荐
相关产品推荐

