A task is an app or script whose code is included as part of a deployed app, but runs independently in a separate container.
Unlike an app (a long-running process), tasks run for a finite amount of time, and then stop. They run in their own isolated containers that share the application’s deployment config. After a task finishes, Cloud Foundry destroys the container that ran it.
Tasks are used for a multitude of purposes, including database maintenance and migration tasks, indexing, backups, and report generation.
Running a Task
The training-app
includes a task that will echo a statement to standard output. The task is a simple bash script and is packaged as part of the app code. If you unzip the training-app.zip
source you will see this script in the tasks
directory.
You can run the task using cf run-task
. With this command you can specify the amount of disk and memory allocated to the tasks’ container. Given our task is lightweight, we can allocate few resources:
cf run-task training-app -m 8M -k 64M --name sample-task --command tasks/sample-task.sh
You will notice we also gave the task a name: sample-task
. Like an app name, this is a human-readable name used to reference the task inside Cloud Foundry. Cloud Foundry will assign a task id and then queue the task for execution.
Task Status
The execution of tasks is asynchronous. Some tasks may run quickly, while others may take hours. For this reason, it is useful to be able to check on the status of a task.
cf tasks training-app
You should see your task has completed successfully. Note that you can also terminate an ongoing task by running cf terminate-task <TASK-ID>
(however, our example task executes too quickly for you to be able to do this).
Task Logs
You can see the output of the task execution by looking in the logs.
cf logs --recent training-app
You will see the task has printed a statement.
Terminating a task
If you have a long running task, you may need to terminate it at some point. You can do this with the cf terminate-task
command.
Implementation considerations
It is important that you design your tasks to be durable and idempotent. A task runs in a container and it is possible that the container will crash or be rescheduled while a task is running. Or, you may decide you need to terminate a long running task. Therefore, you need to ensure your tasks are idempotent (in the event a task is run more than once) and can recover from failure or rescheduling without corrupting your data or environment.