airflow.providers.standard.operators.bash

BashOperator

執行 Bash 指令碼、命令或一組命令。

模組內容

class airflow.providers.standard.operators.bash.BashOperator(*, bash_command, env=None, append_env=False, output_encoding='utf-8', skip_on_exit_code=99, cwd=None, output_processor=lambda result: ..., **kwargs)[原始碼]

基類: airflow.models.baseoperator.BaseOperator

執行 Bash 指令碼、命令或一組命令。

參閱

有關如何使用此 operator 的更多資訊,請參閱指南: BashOperator

如果 BaseOperator.do_xcom_push 為 True,則 Bash 命令完成時,寫入標準輸出的最後一行也將被推送到 XCom 中

引數
  • bash_command (str | airflow.utils.types.ArgNotSet) – 要執行的命令、一組命令或 Bash 指令碼的引用(必須是‘.sh’或‘.bash’)。(模板化)

  • env (dict[str, str] | None) – 如果 env 不是 None,它必須是一個 dict,定義新程序的環境變數;這些變數將取代預設行為(繼承當前程序環境)。(模板化)

  • append_env (bool) – 如果為 False(預設),則使用 env 引數中傳遞的環境變數,不繼承當前程序環境。如果為 True,則繼承當前程序的環境變數,然後使用者傳遞的環境變數將更新現有繼承變數,或者新變數會新增到其中。

  • output_encoding (str) – Bash 命令的輸出編碼。

  • skip_on_exit_code (int | collections.abc.Container[int] | None) – 如果任務以該退出碼退出,則將任務留在 skipped 狀態(預設值:99)。如果設定為 None,則任何非零退出碼都將被視為失敗。

  • cwd (str | None) – 執行命令的工作目錄(模板化)。如果為 None(預設),則命令在臨時目錄中執行。要使用當前 DAG 資料夾作為工作目錄,您可以設定模板 {{ task.dag.folder }}。當 bash_command 是‘.sh’或‘.bash’檔案時,Airflow 必須對工作目錄有寫入許可權。指令碼(Jinja 模板)將渲染到此目錄中的一個新的臨時檔案中。

  • output_processor (Callable[[str], Any]) – 用於進一步處理 Bash 指令碼輸出的函式(預設是 lambda output: output)。

Airflow 將評估 Bash 命令的退出碼。通常,非零退出碼將導致任務失敗,零退出碼將導致任務成功。退出碼 99(或在 skip_on_exit_code 中設定的其他退出碼)將丟擲 airflow.exceptions.AirflowSkipException,這將使任務處於 skipped 狀態。透過設定 skip_on_exit_code=None,可以將所有非零退出碼視為失敗。

退出碼

行為

0

0

skip_on_exit_code (預設: 99)

丟擲 airflow.exceptions.AirflowSkipException

其他

丟擲 airflow.exceptions.AirflowException

注意

除非整個 shell 以非零退出碼退出,否則 Airflow 將不會識別非零退出碼。如果非零退出碼來自子命令,這可能是一個問題。解決此問題的最簡單方法是在命令前加上 set -e;

bash_command = "set -e; python3 script.py '{{ data_interval_end }}'"

注意

要簡單地執行 .sh.bash 指令碼(不包含任何 Jinja 模板),請在指令碼名稱 bash_command 引數後新增一個空格——例如 bash_command="my_script.sh "。這是因為當檔案以 .sh.bash 結尾時,Airflow 會嘗試載入此檔案並將其作為 Jinja 模板處理。

如果您的指令碼中有 Jinja 模板,請不要在末尾新增空格。並在 DAG 的 template_searchpath 中新增指令碼所在的目錄。如果您指定了 cwd,則 Airflow 必須對此目錄有寫入許可權。指令碼(Jinja 模板)將渲染到此目錄中的一個新的臨時檔案中。

警告

bash_command 中使用“使用者”輸入或 Jinja 模板時應小心,因為此 Bash operator 不會對命令執行任何轉義或清理操作。

這主要適用於使用“dag_run” conf,因為這些可以透過 Web UI 中的使用者提交。大多數預設模板變數沒有風險。

例如,不要這樣做:

bash_task = BashOperator(
    task_id="bash_task",
    bash_command='echo "Here is the message: \'{{ dag_run.conf["message"] if dag_run else "" }}\'"',
)

相反,您應該透過 env kwarg 傳遞它,並在 bash_command 內部使用雙引號,如下所示:

bash_task = BashOperator(
    task_id="bash_task",
    bash_command="echo \"here is the message: '$message'\"",
    env={"message": '{{ dag_run.conf["message"] if dag_run else "" }}'},
)

版本 2.10.0 中新增: output_processor 引數。

template_fields: collections.abc.Sequence[str] = ('bash_command', 'env', 'cwd')[原始碼]
template_fields_renderers[原始碼]
template_ext: collections.abc.Sequence[str] = ('.sh', '.bash')[原始碼]
ui_color = '#f0ede4'[原始碼]
bash_command[原始碼]
env = None[原始碼]
output_encoding = 'utf-8'[原始碼]
skip_on_exit_code = 99[原始碼]
cwd = None[原始碼]
append_env = False[原始碼]
output_processor[原始碼]
property subprocess_hook[原始碼]

返回用於執行 Bash 命令的 Hook。

get_env(context)[原始碼]

構建要暴露給 Bash 命令的環境變數集。

execute(context)[原始碼]

建立 operator 時派生。

Context 與渲染 Jinja 模板時使用的字典相同。

有關更多 context,請參閱 get_template_context。

on_kill()[原始碼]

重寫此方法以在任務例項被終止時清理子程序。

在 operator 內部使用 threading、subprocess 或 multiprocessing 模組時,需要進行清理,否則會留下殭屍程序。

此條目有用嗎?