Process management allows you to monitor and control background execution processes. You can list running processes, check their status, and terminate them when needed.
Overview
Process management is essential for:
- Monitoring background execution progress
- Checking process status and output
- Terminating long-running or stuck processes
- Managing multiple concurrent executions
Process management works with processes started via run_code_background(). For system processes, see system process listing in the Observability section.
Listing Processes
List all background execution processes:
from hopx_ai import Sandbox
sandbox = Sandbox.create(template="code-interpreter")
# List all processes
processes = sandbox.list_processes()
print(f"Found {len(processes)} processes")
for proc in processes:
print(f" {proc.get('name', 'unnamed')}: {proc['status']} (ID: {proc['process_id']})")
sandbox.kill()
Process Status
Check detailed status of processes:
from hopx_ai import Sandbox
sandbox = Sandbox.create(template="code-interpreter")
# Start a background process
result = sandbox.run_code_background(
code='import time; time.sleep(30)',
language='python',
name='status-demo'
)
process_id = result['process_id']
# Check status
processes = sandbox.list_processes()
proc = next((p for p in processes if p['process_id'] == process_id), None)
if proc:
print(f"Process: {proc.get('name', 'unnamed')}")
print(f"Status: {proc['status']}")
print(f"Process ID: {proc['process_id']}")
print(f"Execution ID: {proc.get('execution_id', 'N/A')}")
if proc['status'] == 'completed':
print(f"Output: {proc.get('stdout', '')}")
elif proc['status'] == 'failed':
print(f"Error: {proc.get('stderr', '')}")
sandbox.kill()
Process States
Processes can be in different states:
queued - Waiting to start
running - Currently executing
completed - Finished successfully
failed - Execution failed
killed - Terminated by user
from hopx_ai import Sandbox
sandbox = Sandbox.create(template="code-interpreter")
# Start multiple processes
proc1 = sandbox.run_code_background('import time; time.sleep(10)', name='task-1')
proc2 = sandbox.run_code_background('import time; time.sleep(20)', name='task-2')
# Check states
processes = sandbox.list_processes()
for proc in processes:
status = proc['status']
name = proc.get('name', 'unnamed')
if status == 'running':
print(f"🟢 {name} is running")
elif status == 'completed':
print(f"✅ {name} completed")
elif status == 'failed':
print(f"❌ {name} failed")
elif status == 'queued':
print(f"⏳ {name} is queued")
elif status == 'killed':
print(f"🛑 {name} was killed")
sandbox.kill()
Killing Processes
Terminate running processes:
from hopx_ai import Sandbox
sandbox = Sandbox.create(template="code-interpreter")
# Start a long-running process
result = sandbox.run_code_background(
code='import time; time.sleep(300)',
language='python',
name='long-task'
)
process_id = result['process_id']
print(f"Started process: {process_id}")
# Kill the process
sandbox.kill_process(process_id)
print("Process killed")
# Verify it's killed
processes = sandbox.list_processes()
proc = next((p for p in processes if p['process_id'] == process_id), None)
if proc:
print(f"Status: {proc['status']}") # Should be 'killed'
sandbox.kill()
Monitoring Multiple Processes
Monitor multiple processes simultaneously:
from hopx_ai import Sandbox
import time
sandbox = Sandbox.create(template="code-interpreter")
# Start multiple processes
processes = []
for i in range(3):
result = sandbox.run_code_background(
code=f'import time; time.sleep({10 + i*5})',
language='python',
name=f'task-{i+1}'
)
processes.append(result['process_id'])
print(f"Started {len(processes)} processes")
# Monitor all processes
while True:
all_processes = sandbox.list_processes()
active = [p for p in all_processes if p['process_id'] in processes and p['status'] in ['queued', 'running']]
if not active:
print("All processes completed")
break
print(f"\nActive processes: {len(active)}")
for proc in active:
print(f" {proc.get('name')}: {proc['status']}")
time.sleep(2)
# Show final status
all_processes = sandbox.list_processes()
for proc in all_processes:
if proc['process_id'] in processes:
print(f"{proc.get('name')}: {proc['status']}")
sandbox.kill()
Complete Example
Here’s a complete process management workflow:
from hopx_ai import Sandbox
import time
sandbox = Sandbox.create(template="code-interpreter")
# Start multiple background tasks
tasks = {
'data-processing': 'import time; time.sleep(20); print("Data processed")',
'ml-training': 'import time; time.sleep(30); print("Model trained")',
'report-generation': 'import time; time.sleep(15); print("Report generated")'
}
process_ids = {}
for name, code in tasks.items():
result = sandbox.run_code_background(code, language='python', name=name)
process_ids[name] = result['process_id']
print(f"✅ Started: {name} (ID: {result['process_id']})")
# Monitor all processes
print("\n📊 Monitoring processes...")
while True:
all_processes = sandbox.list_processes()
active = [
p for p in all_processes
if p['process_id'] in process_ids.values()
and p['status'] in ['queued', 'running']
]
if not active:
break
print(f"\nActive: {len(active)}/{len(tasks)}")
for proc in active:
name = proc.get('name', 'unknown')
status = proc['status']
print(f" {name}: {status}")
time.sleep(3)
# Show final results
print("\n📋 Final Status:")
all_processes = sandbox.list_processes()
for name, proc_id in process_ids.items():
proc = next((p for p in all_processes if p['process_id'] == proc_id), None)
if proc:
status_icon = {
'completed': '✅',
'failed': '❌',
'killed': '🛑'
}.get(proc['status'], '⏳')
print(f"{status_icon} {name}: {proc['status']}")
if proc['status'] == 'completed' and proc.get('stdout'):
print(f" Output: {proc['stdout'].strip()}")
sandbox.kill()
Best Practices
1. Name Your Processes
Always name processes when starting them for easier identification in process lists.
2. Monitor Regularly
Check process status periodically to track progress and detect failures early.
3. Clean Up Completed Processes
Remove or archive completed processes to keep your process list manageable.
4. Handle Failures
Check for failed status and access stderr for error details when processes fail.
5. Kill Stuck Processes
Use kill_process() to terminate processes that are stuck or taking too long.
Next Steps