$orch['enabled'], 'cron' => $orch['cron']]; foreach ($orch['children'] ?? [] as $child) { $treeMap[$child['id']] = ['enabled' => $child['enabled'], 'cron' => $child['cron']]; } } ?>
Custom Scripts script
Scheduler Information
Controls
  • Toggle — saves to schedule.json immediately
  • Cron — 5-field expression; hit Save Schedule to apply all at once
  • Run — fires script immediately regardless of schedule
  • Dry Run — same as Run with DRY_RUN=1
  • Log — opens script log in this panel; auto-scrolls to latest
  • Stop — sends SIGTERM to process group → 3 s → SIGKILL; clears stuck locks
  • Verbose — appends --log for detailed per-step output
  • Config — edit host-scoped settings for scripts that support it
Orchestrators
  • Enabled (ON) — orchestrator is the sole trigger; its cron fires it and it calls all children in order
  • Disabled (OFF) — orchestrator never runs; all children switch off and crons are suppressed
  • Child toggles (orch ON) — comment or uncomment the script's line in master.conf *_SCRIPTS array
  • Child cron (orch ON) — ignored; orch is the only trigger while it is enabled
  • Child cron (orch OFF) — enable a child and give it a cron to run it on its own schedule, independent of the orch
  • ⚡ Array Start / Stop — triggered by Unraid array events; no cron field; toggle enables or disables the handler
Children & Advanced
  • Advanced ▸ — expand to see child scripts managed by the orchestrator
  • Toggle (orch ON) — comments or uncomments the script entry in master.conf; determines whether the orch calls it
  • Toggle (orch OFF) — has no effect without a cron; pair with a cron expression to run standalone
  • Cron (orch OFF) — child runs on its own schedule; completely independent of the parent orchestrator
  • Rsync child — shows amber TIER_RSYNC_ENABLED badge; toggle writes true / false directly to master.conf — controls whether rsync runs inside that orchestrator
  • Rsync (orch OFF) — toggle is disabled; rsync flag only matters when the orchestrator is running
Suggested Schedules
$block): $scripts = $block['scripts']; $schedule = $block['schedule']; // Extract just the 5-field cron from schedule string $schedParts = preg_split('/\s+/', $schedule, 6); $cronOnly = (count($schedParts) >= 5) ? implode(' ', array_slice($schedParts, 0, 5)) : ''; $schedLabel = (count($schedParts) >= 6) ? trim($schedParts[5], '() ') : $schedule; // Status: any matching script configured? $configured = false; $enabled = false; foreach ($scripts as $s) { if (isset($treeMap[$s['rel']])) { $configured = true; if ($treeMap[$s['rel']]['enabled']) $enabled = true; } } // Trim trailing blank desc lines $desc = $block['desc']; while (!empty($desc) && trim(end($desc)) === '') array_pop($desc); ?>

user_script_plug-in.sh not found at

/dev/null', $psLines); foreach ($psLines as $line) { if (preg_match('#' . preg_quote(SCRIPTS_DIR, '#') . '/([^\s]+\.sh)#', $line, $rm)) { $runningScripts[] = basename($rm[1], '.sh'); } } $runningScripts = array_unique($runningScripts); ?>