Extract stuck at 100%
100% does not mean done.
Frame extract sets percent: 100 when the last frame finishes, but the job stays
status: "running" through viewer → link →
data_table → finalize. Only then does the server set
status: "done".
1. Read the live job
Best first step on the host or from any machine that can reach CREWS:
curl -sS "https://crews.championship.technology/api/extract/active" | python3 -m json.tool # or a known job id: curl -sS "https://crews.championship.technology/api/extract/<JOB_ID>" | python3 -m json.tool
| Field | Meaning if stuck at 100% |
|---|---|
status |
Still running = worker alive but not terminal; done / error / cancelled = UI lag |
phase |
Where it’s blocked: extract / viewer / link / data_table / finalize |
message |
Last progress line |
done / total |
Frames finished vs expected |
detail |
Present on unexpected exceptions |
2. Tail server-side logs
On the host (CREWS app root):
# Live extract trail (phase + %)
tail -n 80 logs/ui.log
# or follow:
tail -f logs/ui.log | grep extract
# History (only written on terminal outcome)
python3 -c "import json; d=json.load(open('logs/extract_history.json')); print(json.dumps(d.get('entries',[])[:3], indent=2))"
If ui.log stops after something like extract 100% /
phase extract and never shows viewer, data_table,
or done, the worker is hung in post-frame work (or dead without a terminal status).
3. Check OS processes
# CREWS Python still up? ps aux | grep -E '[p]ython.*server|[p]ython.*crews' # ffmpeg still chewing frames? (should be gone after 100% frames) ps aux | grep '[f]fmpeg' # ffprobe during data_table (can take up to 60s per video) ps aux | grep '[f]fprobe'
- ffmpeg still running → last frame(s) not actually finished; UI % can round to 100 early.
- ffprobe running → normal for
phase=data_tablewith many videos (60s timeout each). - Neither, phase stuck → likely hung on disk I/O, registry write, or a deadlocked thread.
4. Disk / project output
# Project folder growing? ls -lah projects/<slug>/ ls projects/<slug>/ | wc -l # viewer written? ls -lah projects/<slug>/viewer.html # data table? ls -lah data_tables/ | tail
If frames and viewer.html exist but the job never goes done,
post-return work in _run_extract_job (link/sync) or the UI poll is the issue.
5. Interpret phase → action
| phase at 100% | Likely cause | What to do |
|---|---|---|
extract |
Last ffmpeg worker stuck | Kill orphan ffmpeg; check disk space; cancel job |
viewer / link |
Writing/registering project | Check perms on projects/ + projects.json |
data_table |
ffprobe × N videos |
Wait, or check stuck ffprobe; large RAR member listing |
finalize |
Server finishing registry before done |
Should be brief; if long, check disk + thread health |
| missing / frozen log | Worker thread died hard | Restart CREWS; check systemd/journal or console traceback |
6. Unstick safely
# Prefer cancel API if job_id known curl -sS -X POST "https://crews.championship.technology/api/extract/<JOB_ID>/cancel" # Then restart CREWS process (jobs are in-memory only) # systemd example: sudo systemctl restart crews # use your real unit name
After restart, in-memory jobs vanish. Check whether projects/<slug>/
and history already look complete; you may only need a browser refresh / relink,
not a full re-extract.
Quick triage order
GET /api/extract/active→ notephase+messagetail logs/ui.log→ last extract linepsforffmpeg/ffprobe- Inspect
projects/<slug>/viewer.html - Cancel + restart only if the worker is clearly dead/hung
crw >x< crush · extract docs · server-side troubleshooting