Repository navigation
Background Jobs
Reporting β System logs β Background jobs shows every scheduled job FreeITSM relies on, whether each one is doing its work, and every run it has made. It answers one question that nothing else in FreeITSM could: has anything quietly stopped?
Why this exists. A background job that stops does not announce itself. Nothing errors and nothing appears in a log - SLA warnings just stop arriving, webhooks sit in a queue, repeating tasks stop appearing. The first sign is usually somebody asking why. This page, a card on Watchtower and a notice on the System page make that visible, and a health address lets an outside monitoring tool raise the alarm on its own. Requested in #182; the design is Background job health - design.
- Setting the jobs up is a different page: Scheduled tasks lists every job, what it needs and how to schedule it on Windows, Linux and Docker.
- Developers: Background jobs - Developer Guide.
The top half of the tab lists the jobs, the ones that need attention first. Each shows what stops without it, its health, the last time its schedule ran it successfully, its last run of any kind, and how often it is expected to run.
| Health | Means | What to do |
|---|---|---|
| Healthy | Its schedule ran it successfully within its expected interval plus some slack | Nothing |
| Overdue | No scheduled run has succeeded for longer than that | Check the job is still scheduled - see Scheduled tasks |
| Failing | Its most recent real run failed - the message says why | Read the message; the run history has the detail |
| Partial | Part of its work failed and has not succeeded since - one tracker connection, one directory, one server, one calendar. It is named | Fix that source; the job recovers when that source next works |
| Stuck | A run started longer ago than any normal run takes, and never finished | Look for a hung process; the next finished run records the stuck one as failed |
| Unknown | FreeITSM could not read something it needs to judge the job - whether it is needed, its settings, its run history or how its sources last ran. Usually the database being unavailable. Shown as a problem, and the strict health address answers 503, rather than assumed fine | Check the server's error log |
| Never seen | The job is needed here, but no scheduled run has ever been recorded | Schedule it. The tab shows the command to schedule |
| Not needed | The feature it serves is not in use on this install - no fixed-schedule repeats, no tracker connections, LMS reminders switched off | Nothing |
| Not used here | Somebody has said this install does not run it, on purpose | Nothing - who said so, and when, is shown |
Worked out when you open the tab. Nothing has to run for a job to turn overdue - time passing is enough. That is the point: a job that has stopped cannot tell you it has stopped.
After upgrading, every job you need shows Never seen until its schedule next runs it, because run history starts on the day this was added. A job you run every few minutes turns healthy within minutes; a daily one, by tomorrow.
Three rules decide health. They were agreed on the issue, and they are what make the page trustworthy rather than reassuring.
- Only the schedule proves the schedule. Some jobs also run when somebody opens a page (Domains, LMS reminders, project alerts) or presses Run now. Those runs do the work, and they appear in the history - but they never keep a job healthy. A job whose cron entry has gone turns overdue however often somebody opens its page, and the tab says "It has run since, but only by page load".
- Nothing but success clears a failure. A run that did no work - turned away by its lock or minimum interval, switched off, or a dry run - is shown as Skipped, and never makes a failing job look healthy, however recent it is.
- A failing source stays failing until that source works. If one of four directories fails, the job is Partial and names that directory until a run processes that directory successfully - not merely until some other run succeeds. Switching the source off, or deleting it, also clears it: it is no longer expected.
A call turned away at the door - the job's web address called with the wrong token - is not a run at all, because anyone can make one. The job shows "Last call turned away: wrong token" instead, which is the clue when a scheduler is still calling an old address after the token changed.
The bottom half lists every run, newest first, filtered by job, outcome, what started it and period. Click a run to see its counts, its message and the result for each source it worked through.
| Started by | Means |
|---|---|
| Schedule (command line) | cron or Windows Task Scheduler running the script |
| Schedule (web address) | a scheduler or monitoring tool calling the job's token address |
| Page load | the job ran in passing when somebody opened its page |
| Run now | somebody pressed Run now (or Sync now, or ran one directory by hand) |
| Outcome | Means |
|---|---|
| OK | It worked. A run that found nothing to do is OK |
| Partial | Some sources worked and some did not |
| Failed | It did not do its work |
| Skipped | It did no work: its lock or minimum interval turned it away, the feature is off, or it was a dry run |
| Running | It is running now |
Kept for 13 months, so a yearly audit can still read it - repeating task evidence uses it to explain missing occurrences. Skipped runs, which can arrive every minute, are kept for 30 days.
Messages never contain secrets. A job's summary is written by the job, and anything that looks like a password, a token or a URL's query string is blanked before it is stored.
A page only helps somebody who looks at it. So while anything needs attention:
- Watchtower shows a Background jobs card above the others, naming each job and what it affects. It appears only while something is unhealthy, and only for people allowed to see job health.
- The System page shows an amber notice to administrators.
Both are worked out when the page is opened, so neither depends on any job running.
Why no email or bell notification? Sending one would itself need a background job - the very thing that may have stopped. The reliable alarm is an outside monitor (below); Watchtower and the System notice cover people who are already in FreeITSM.
GET /api/v1/jobs/health
GET /api/v1/jobs/health?strict=1
Call it with an API key holding the Background job health - read permission (System β API). It returns every job's health, last scheduled success, last run and failing sources, and an overall healthy or unhealthy. It never runs a job and never returns passwords, tokens or command lines.
-
?strict=1answers HTTP 503 while any needed job is unhealthy, and 200 otherwise - so a monitoring tool that only looks at the status code still raises the alarm. - If FreeITSM or its database is down, the address fails - an error, never a cheerful "healthy" - which is itself the alarm.
- Install-wide, so the key must be too. Job health covers every company, so the key, and the analyst it acts as, must reach every company (or the analyst must be an administrator).
Examples - a check every five minutes from Uptime Kuma, Zabbix, Nagios or a plain script:
curl -fsS -H "Authorization: Bearer fitsm_..." "https://itsm.example.com/api/v1/jobs/health?strict=1" > /dev/null \
|| echo "FreeITSM background jobs need attention"The full reference is on REST API.
Edit on a job (with the permission below) does two things:
- Expected to run every - how often your scheduler actually runs it. The default comes from Scheduled tasks: the SLA check every 5 minutes, repeating tasks daily, and so on. If you run the SLA check every 15 minutes, say so, or it will show overdue between runs. The slack before it turns overdue grows with the interval.
- Not used here - for a job this install deliberately does not run. Its health is no longer checked, and the tab records who marked it and when, because it silences that job's alarm.
| Permission (System β Roles) | Lets someone | Notes |
|---|---|---|
| View background job health | Open the tab, see the Watchtower card | Also needs Reporting module access and access to every company - job messages name directories, servers and tracker connections that belong to all of them |
| Change what background jobs are expected to do | Edit intervals and mark jobs not used here | Sensitive: it can silence an alarm |
Administrators hold both. Nobody else sees the tab until a role grants it, so upgrading changes nothing for them.
The FreeITSM image runs no scheduler of its own, so on a Docker install every job shows Never seen until the host runs them. Schedule them from the host with docker exec - see the Docker section of Scheduled tasks.
- Scheduled tasks - setting each job up
- Background jobs - Developer Guide
- Background job health - design (#182)
- Repeating task evidence - which reads this history
- Reporting Β· Watchtower Β· REST API Β· Roles and permissions
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
-
Architecture
- β³ π§Ή Root folder tidy (URL routing)
- β³ π Database Integrity (FKs & constraints)
- β³ π οΈ Database Verification β Developer Guide
- β³ π§© Service Layer (UI + API share code)
- β³ πͺ€ Code traps (the TRAP: comments)
- β³ π Commenting for the Engineering wiki
- β³ π οΈ Engineering wiki scanner - Developer Guide
- β³ π Service-Layer progress
- π€ Contributing (read before a pull request)
- π§ͺ Developer tests
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- π Date & Time Formats
- π± Currencies
- π§ The sidebar (optional module rail)
- π Display order (modules, Watchtower cards) β Developer Guide
- Theming & Dark Mode
- ποΈ Recent β getting back to what you were doing
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
-
MobileβFriendly
- β³ π« Mobile: Tickets
- β³ π» Mobile: Assets
- β³ π Mobile: Calendar
- β³ π Mobile: Knowledge
- β³ π¦ Mobile: Service Status
- β³ πΌ Mobile: Watchtower
- β³ π§© Mobile: Problem Management
- β³ π Mobile: Change Management
- β³ πΏ Mobile: Software
- β³ β Mobile: Tasks
- β³ π Mobile: Forms
- β³ π Mobile: Contracts
- β³ π Mobile: Domains
- β³ π Mobile: People
- β³ π Mobile: Projects
- β³ ποΈ Mobile: Files
- β³ π Mobile: LMS
- β³ πΊοΈ Mobile: CMDB
- β³ πΊοΈ Mobile: Network Mapper
- β³ π§ Mobile: Process Mapper
- β³ βοΈ Mobile: Workflow
- β³ π₯οΈ Mobile: System
- β³ π Mobile: Reporting
- β³ π Mobile: System Wiki
- β³ π Mobile: Self-Service Portal
- β³ π§° Mobile: Techniques & Tricks
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- β³ π‘οΈ CSRF protection (S4) β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- π CardDAV contact sync
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π Proposal: custom fields, inventory import and change evidence (#194)
- β³ π οΈ Custom fields, evidence + inventory - review (#195-#197)
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π REST API: Domains
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ π·οΈ REST API: Cost centres
- β³ π§βπΌ REST API: Analysts
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ π Rota copy and paste β Developer Deep Dive
- β³ β Checklists & SOPs
- β³ βοΈ Mandatory fields
- β³ π§Ύ Custom ticket fields
- β³ π·οΈ Ticket categories
- β³ π₯ Assigning tickets to a team, and escalation
- β³ π’ One board across every company
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ π Attachment size limits and large emails
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
-
β³
βοΈ Telegram channel - β³ β CSAT company scope and filters β Developer Guide
- β³ π₯ Microsoft Teams channel
- β³ π¨οΈ Mattermost channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ β Record previews
- β³ π Ticket notes: internal or shared
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ π¨ Telling the analyst a ticket is theirs
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ π Confidential tickets
- β³ π₯ Portal managers
- β³ π Who has seen a ticket
- β³ π Reading long tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ ποΈ The folder pane
- β³ π½ Just my tickets, or no closed ones
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- β³ π Scheduled work in your own calendar
- Problem Management
- Tasks
- π Projects
-
Assets
- β³ π’ Moving an asset between companies
- β³ π Shared asset locations
- β³ π§βπΌ Assigning assets to analysts
- β³ π Warranty and lease alerts
- β³ π Leases
- β³ π Saved table views
- β³ π¨οΈ Recording anything, and importing it
- β³ π·οΈ QR asset labels
- β³ π Who holds what, and handover documents
- β³ π₯οΈ The inventory agent (PowerShell)
- β³ ποΈ Proxmox VE servers
- β³ βοΈ VMware Cloud Director servers
- β³ π Linking equipment to tickets
- β³ βοΈ Follow-up tasks on a ticket
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
-
Forms
- β³ π¨ The form designer β Developer Guide
- β³ π Layout & the grid β Developer Guide
- β³ ποΈ Collections β grouping submissions
- β³ π Submissions as PDFs
- β³ β‘ What happens next β a form's own actions
- β³ π οΈ Sections & conditional logic β Developer Guide
- β³ π οΈ Lookup fields β Developer Guide
- β³ π‘οΈ Catalogue request approvals
- People
- Domains
- ποΈ Files
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ π’ One board across every company
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)
- What this is
-
π Bugs resolved
- β³ π Repeating tasks ignored company scope
- β³ π¬ #183 Mailbox checks overlapped
- β³ π #188 Transfer lock shown off when unknown
- β³ β #184 Subtask names and Overdue
- β³ π§© #186 Teams: the buttons did nothing
- β³ π Text in a change could run script
- β³ π AI settings changed without the AI permission
- β³ πͺ #178 Deleting an analyst failed
- β³ π« A team with no departments showed 0 tickets
- β³ π Projects: adding a phase did nothing on Save
- β³ π Leavers could still sign in
- β³ πΌοΈ Logo and courses broke on Apache with PHP-FPM
- β³ π’ Chat tickets ignored your ticket numbering
- β³ π Dates shown as a dash, or in server time
- β³ π Assets β Users showed people from other companies
- β³ π Restricted analysts could read other modules' data
- β³ πΌοΈ Replies with a picture in the thread failed to send
- β³ π Reply attachments never reached the customer
- β³ π οΈ Outbound email attachments β Developer Guide
- β³ π A global SSO provider was missing from the portal
- β³ π Behind a proxy, the SSO redirect said http
- β³ βοΈ The portal tagline moved when you saved it
- β³ π¨ The portal settings screen forgot what you saved
- β³ π‘οΈ The approvals inbox said "Error" and nothing else
- β³ π A table's answers were missing from the PDF
- β³ β A single-select column let you tick every option
- β³ π The portal ignored a form's field widths
- β³ π The tasks board stopped taking clicks
- β³ ποΈ #121 The index list is out of date after upgrading
- β³ π #133 The calendar subscription was empty
- β³ π #131 Tasks always reopened on the board
- β³ π₯ #129 Every page returned HTTP 500 after upgrading
- β³ π³ #127 A PHP warning above the System page
- β³ π #126 Notes stamped with the server's clock
- β³ π Storing every date in UTC
- β³ πͺ The portal was down for everyone signed in
- β³ βοΈ #120 Workflow notes could never be written
- β³ βοΈ #123 Three errors when running Database Verification
- β³ π #122 The description box was a stub in the corner
- β³ π£ Demo data deleted real accounts
- β³ π #117 Sign-in redirected to the wrong address
- β³ π¨ #108 The priority dot was invisible
- β³ β±οΈ #116 Time logged from the right-click menu
- β³ π #114 API keys refused by our own guard
- β³ ποΈ #110 Assigning a task told nobody
- β³ πͺ #107 Signed out while still working
- β³ π #103 "Share with Requester" reached nobody
- β³ π #102 Search found nothing for hyphens
- β³ πͺ #101 Source code editor opened behind
- β³ βοΈ #88 Subtasks could not be ticked off
- β³ π» #84 Asset deep link selected nothing
- β³ π« #79 A new ticket arrived with no status
- β³ π§ #79 A ticket from email did not say so
- β³ π #78 Bell opened to nothing
- β³ π¬ #77 Mail only collected from Inbox
- β³ π #74 The default password could not be changed
- β³ π¦ #70 Renaming an impact level
- β³ π€ #67 App-only mailboxes could not send
- β³ π #45 Verify only ever worked for Microsoft
- β³ π #45 IMAP reported as not authenticated
- β³ βοΈ An email template stopped escaping itself
- β³ π The portal dashboard showed the wrong time
- β³ π’ The folder said 99 and the list showed 96