26

I have a bash script that creates a file (if it does not exist) that I want to run in Airflow, but when I try it fails. How do I do this?

#!/bin/bash
#create_file.sh

file=filename.txt

if [ ! -e "$file" ] ; then
    touch "$file"
fi

if [ ! -w "$file" ] ; then
    echo cannot write to $file
    exit 1
fi

and here's how I'm calling it in Airflow:

create_command = """
 ./scripts/create_file.sh
"""
t1 = BashOperator(
        task_id= 'create_file',
        bash_command=create_command,
        dag=dag
)

lib/python2.7/site-packages/airflow/operators/bash_operator.py", line 83, in execute
    raise AirflowException("Bash command failed")
airflow.exceptions.AirflowException: Bash command failed

2 Answers 2

25

From the tutorial this is OK:

t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    retries=3,
    dag=dag)

But you're passing a multi-line command to it

create_command = """
 ./scripts/create_file.sh
"""

should be

create_command = "./scripts/create_file.sh "

Moreover, you also have to make sure that you are in the correct directory to avoid cryptic errors. Do it like this for example:

create_command = "./scripts/create_file.sh "
if os.path.exists(create_command):
   t1 = BashOperator(
        task_id= 'create_file',
        bash_command=create_command,
        dag=dag
   )
else:
    raise Exception("Cannot locate {}".format(create_command))
Sign up to request clarification or add additional context in comments.

6 Comments

add space after .sh : "./scripts/create_file.sh "
sometimes you might receive error: This fails with Jinja template not found, in order to overcome add space at the end of the script, not sure what drives this behaviour: ref: cwiki.apache.org/confluence/display/AIRFLOW/Common+Pitfalls
@KarolSudol Its because airflow checks the end of the line you pass in and if it ends in .sh it tries to treat it as a template. A space breaks that check and it doesn't treat it as a template. I still can't figure out the why, though.
thanks for that space tip - would noooot have figured that out myself
jinga syntax definition says to add spaces in start & end of defined operator like {{ operator }}, rest looks good.
|
2

From the documentation:

t2 = BashOperator(
    task_id='bash_example',
    # "scripts" folder is under "/usr/local/airflow/dags"
    bash_command="scripts/test.sh",
    dag=dag)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.