diff --git a/nomad/cli/admin/run.py b/nomad/cli/admin/run.py
index fb807a75b10a86d7e4f27a3f091ad0f7d40519a4..8307b7476a2ff1ed47a485a9c6bf8b27cbe967ac 100644
--- a/nomad/cli/admin/run.py
+++ b/nomad/cli/admin/run.py
@@ -230,8 +230,21 @@ def run_appworker(
         celery_workers = 1
 
     with concurrent_futures.ProcessPoolExecutor(2) as executor:
-        executor.submit(task_worker, workers=celery_workers)  # type: ignore
-        executor.submit(task_app, workers=fastapi_workers, host=app_host, port=app_port)  # type: ignore
+        results = []
+
+        def _submit(*args, **kwargs):
+            results.append(executor.submit(*args, **kwargs))
+
+        _submit(task_worker, workers=celery_workers)
+        _submit(task_app, workers=fastapi_workers, host=app_host, port=app_port)
+
+        try:
+            for future in concurrent_futures.as_completed(results):
+                future.result()
+        except KeyboardInterrupt:
+            for future in results:
+                future.cancel()
+            executor.shutdown(wait=False)
 
 
 @run.command(help='Run both app and worker.')