diff --git a/awx/main/tasks.py b/awx/main/tasks.py index da798a59f2..ece7e1e7a6 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -114,6 +114,17 @@ def tower_periodic_scheduler(self): new_unified_job.socketio_emit_status("failed") emit_websocket_notification('/socket.io/schedules', 'schedule_changed', dict(id=schedule.id)) +@task(bind=True) +def clean_stdout_tempfiles(self): + nowtime = time.time() + removed = 0 + for this_file in os.listdir(settings.STDOUT_TEMP_DIR): + this_file = os.path.join(settings.STDOUT_TEMP_DIR, this_file) + if "towerjob" in this_file and os.stat(this_file).st_mtime < nowtime - 86400: + os.remove(this_file) + removed += 1 + print("Removed %d files" % removed) + @task() def notify_task_runner(metadata_dict): """Add the given task into the Tower task manager's queue, to be consumed diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 912fe25e1e..f99d389e52 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -303,6 +303,10 @@ CELERYBEAT_SCHEDULE = { 'task': 'awx.main.tasks.tower_periodic_scheduler', 'schedule': timedelta(seconds=30) }, + 'job_stdout_cleanup': { + 'task': 'awx.main.tasks.clean_stdout_tempfiles', + 'schedule': timedelta(hours=3) + }, } # Any ANSIBLE_* settings will be passed to the subprocess environment by the