Reboot Pending Prompt - Autofix [Macintosh]
Overview
This script acts as the remediation (Autofix) component of the "Reboot Pending Prompt" solution for macOS. It is triggered automatically when the Detection script determines that a reboot is necessary and conditions are right to interrupt the user.
Unlike Windows, where RMM scripts run in an isolated Session 0 and require Scheduled Task wrappers to display a GUI, macOS scripts running as root from NinjaRMM can render directly in the console user's active session. Therefore, this script executes the OmniPrompt.app utility directly, simplifying the execution flow while maintaining the same robust "Deferral" vs. "Forced" phase logic.
Install-In-Progress Protection
Before rebooting an unattended machine (no user logged in, or locked screen with the forced reboot threshold reached), the script checks whether software or updates are currently being installed. If an install is detected, the script exits cleanly without rebooting. It will try again on the next cycle after the install finishes.
This prevents the machine from restarting in the middle of a macOS software update, application installer, or feature upgrade.
The following macOS-specific processes are checked:
| Signal | What It Means |
|---|---|
softwareupdate | macOS Software Update is actively installing an update |
install | A general macOS installer package is running |
msud | macOS Software Update Daemon is active |
setupd | macOS Setup Assistant or installer is running |
osinstallersetupd | macOS OS Installer is actively performing an upgrade |
Note: This check only blocks unattended reboots. If a user is at their desk and clicks "Yes" or "OK" to reboot, the reboot happens immediately. The user made a conscious choice to restart.
Sample Run
Note:
- It is not recommended to run this script manually. The script is designed for the Autofix action of the Reboot Pending Prompt - Macintosh compound condition.
OmniPromptis a cross-platform, Go-based GUI utility that runs natively on macOS without requiring any external runtimes (like .NET).
Dependencies
- Custom Field: cPVAL Reboot Prompt Count
- Custom Field: cPVAL Reboot Prompt Duration Between Prompt
- Custom Field: cPVAL Reboot Prompt Title
- Custom Field: cPVAL Reboot Prompt Message
- Custom Field: cPVAL Final Prompt Message
- Custom Field: cPVAL Reboot Prompt Timeout
- Custom Field: cPVAL Final Prompt Timeout
- Custom Field: cPVAL Final Prompt Reboot Delay Minutes
- Custom Field: cPVAL Reboot Prompt Header Image
- Custom Field: cPVAL Reboot Prompt Icon Image
- Custom Field: cPVAL Reboot Prompt Theme
- Custom Field: cPVAL Reboot if Not Logged In
- Custom Field: cPVAL Reboot During Suppress Period
- Custom Field: cPVAL Reboot Prompt Suppress Time Window
- Custom Field: cPVAL Max Missed Prompts Before Force
- Custom Field: cPVAL Reboot Prompt Size
- Custom Field: cPVAL Reboot Prompt Text Box Size
- Custom Field: cPVAL Reboot Prompt Logo Size
- Custom Field: cPVAL Reboot Prompt Text Size
- Custom Field: cPVAL Reboot Prompt Text Style
- Custom Field: cPVAL Reboot Prompt Button Text Style
- Custom Field: cPVAL Reboot Prompt Button Text Size
- Custom Field: cPVAL Reboot Prompt Button Size
- Custom Field: cPVAL Reboot Prompt Title Text Style
- Custom Field: cPVAL Reboot Prompt Title Text Size
- Custom Field: cPVAL Reboot Prompt Title Field Size
- Custom Field: cPVAL Last Prompted
- Custom Field: cPVAL Times Prompted
- Custom Field: cPVAL Pending Reboot
- Custom Field: cPVAL Consecutive Missed Prompts
- Custom Field: cPVAL First Missed Prompt Time
- Application: OmniPrompt
- Automation: Reboot Pending Prompt - Detection [Macintosh]
- Solution: Reboot Pending Prompt
Custom Fields
| Custom Field | Type | Example | Scope | Available Options | Editable | Description |
|---|---|---|---|---|---|---|
| cPVAL Reboot Prompt Count | Numeric | 5 | Organization, Location, Device | N/A | Yes | Max deferrals allowed before a forced reboot. |
| cPVAL Reboot Prompt Duration Between Prompt | Numeric | 4 | Organization, Location, Device | N/A | Yes | Minimum hours to wait between prompts. |
| cPVAL Reboot Prompt Title | Text | IT Dept: Important Updates | Organization, Location, Device | N/A | Yes | Title of the GUI window. |
| cPVAL Reboot Prompt Message | Multi-line | We installed security patches. | Organization, Location, Device, End User | N/A | Yes | Custom message body. Supports message substitution variables. |
| cPVAL Final Prompt Message | Multi-line | Deferrals exhausted. | Organization, Location, Device | N/A | Yes | Message displayed when no deferrals remain. Supports message substitution variables. |
| cPVAL Reboot Prompt Timeout | Numeric | 600 | Organization, Location, Device | N/A | Yes | Time in seconds before a "Warning" prompt closes automatically. |
| cPVAL Final Prompt Timeout | Numeric | 900 | Organization, Location, Device | N/A | Yes | Time in seconds before a "Final" prompt closes automatically. |
| cPVAL Final Prompt Reboot Delay Minutes | Numeric | 10 | Organization, Location, Device | N/A | Yes | Grace period (in minutes) after final acknowledgment before the forced reboot occurs. |
| cPVAL Reboot Prompt Header Image | Text | https://example.com/logo.png | Organization, Location, Device | N/A | Yes | Local file path or URL for the header image. |
| cPVAL Reboot Prompt Icon Image | Text | C:\Logos\icon.ico | Organization, Location, Device | N/A | Yes | Local file path or URL for the icon image. |
| cPVAL Reboot Prompt Theme | Dropdown | Dark | Organization, Location, Device | Dark, Light | Yes | UI Theme: "Dark" or "Light". |
| cPVAL Reboot if Not Logged In | Dropdown | Enable | Organization, Location, Device | Disable, Enable | Yes | Forces reboot immediately if no user session is active. |
| cPVAL Reboot During Suppress Period | Dropdown | Enable | Organization, Location, Device | Disable, Enable | Yes | Allows unattended/forced reboots during suppress windows or weekends. |
| cPVAL Reboot Prompt Suppress Time Window | Text | 1800-0800 | Organization, Location, Device | N/A | Yes | 24-hour time range (HHmm-HHmm) to suppress prompts. Leave blank to disable. |
| cPVAL Max Missed Prompts Before Force | Numeric | 3 | Organization, Location, Device | N/A | Yes | Number of consecutive missed prompts before forcing a reboot without showing the GUI. Set to 0 to disable. |
| cPVAL Reboot Prompt Size | Text | 640x480 | Organization, Location, Device | N/A | Yes | Size of the prompt window (WIDTHxHEIGHT). |
| cPVAL Reboot Prompt Text Box Size | Text | 500x200 | Organization, Location, Device | N/A | Yes | Size of the text box (WIDTHxHEIGHT). |
| cPVAL Reboot Prompt Logo Size | Text | 400x150 | Organization, Location, Device | N/A | Yes | Size of the logo (WIDTHxHEIGHT). |
| cPVAL Reboot Prompt Text Size | Numeric | 14 | Organization, Location, Device | N/A | Yes | Font size for the message text. |
| cPVAL Reboot Prompt Text Style | Text | Arial | Organization, Location, Device | N/A | Yes | Font family for the message text. |
| cPVAL Reboot Prompt Button Text Style | Text | Arial | Organization, Location, Device | N/A | Yes | Font family for button text. |
| cPVAL Reboot Prompt Button Text Size | Numeric | 14 | Organization, Location, Device | N/A | Yes | Font size for button text. |
| cPVAL Reboot Prompt Button Size | Text | 100x40 | Organization, Location, Device | N/A | Yes | Size of each button (WIDTHxHEIGHT). |
| cPVAL Reboot Prompt Title Text Style | Text | Arial | Organization, Location, Device | N/A | Yes | Font family for the title bar text. |
| cPVAL Reboot Prompt Title Text Size | Numeric | 14 | Organization, Location, Device | N/A | Yes | Font size for the title bar text. |
| cPVAL Reboot Prompt Title Field Size | Text | 640x35 | Organization, Location, Device | N/A | Yes | Size of the title bar (WIDTHxHEIGHT). |
| cPVAL Last Prompted | Text | 2024-05-20 14:30:00 | Device | N/A | No | Updated to current timestamp if user defers. Updated by script. |
| cPVAL Times Prompted | Numeric | 2 | Device | N/A | No | Incremented by 1 if user defers. Resets to 0 on Reboot. Updated by script. |
| cPVAL Pending Reboot | Checkbox | False | Device | True, False | Yes | Set to False upon successful reboot initiation. Updated by script. |
| cPVAL Consecutive Missed Prompts | Numeric | 2 | Device | N/A | No | Tracks consecutive missed prompts. Managed by the Detection script and reset on reboot. |
| cPVAL First Missed Prompt Time | Text | 2024-05-20 14:30:00 | Device | N/A | No | Records when the current missed-prompt streak started. Managed by the Detection script and reset on reboot. |
Configuration Hierarchy
The solution evaluates settings using a strict top-down hierarchy. If a value is configured at a higher priority level, it overrides the lower levels.
| Priority | Level | Description |
|---|---|---|
| 1 (Highest) | Device Level Custom Field | Overrides all lower levels. Applied to a specific endpoint. |
| 2 | Location Level Custom Field | Overrides Organization level. Applied to all endpoints in a location. |
| 3 | Organization Level Custom Field | Global default for the entire tenant. |
| 4 (Lowest) | Script Runtime Variable | Ultimate fallback default used if the custom field is blank at all levels. |
Script Variables
Instead of hardcoding defaults, the script relies on NinjaRMM Script Variables as the ultimate fallback mechanism. You can configure these variables directly in the script's settings within NinjaRMM to establish global baseline behaviors without modifying the script file.
| Name | Type | Example | Default | Available Options | Description |
|---|---|---|---|---|---|
Prompt Title | String/Text | Action Required | Updates Installed - Reboot Required | N/A | Title of the GUI window. |
Regular Prompt Message | String/Text | Security updates applied. | Built-in standard message | N/A | Default message for regular prompts. Supports message substitution variables. |
Final Prompt Message | String/Text | Final warning. | Built-in final warning message | N/A | Default message for final prompts. Supports message substitution variables. |
Prompt Count | Integer | 5 | 4 | N/A | Max deferrals allowed before a forced reboot. |
Final Reboot Delay Minutes | Integer | 10 | 5 | N/A | Grace period after final acknowledgment. |
Duration Between Prompts | Integer | 6 | 4 | N/A | Minimum hours to wait between prompts. |
Regular Prompt Timeout Seconds | Integer | 600 | 300 | N/A | Time in seconds before a Warning prompt closes automatically. |
Final Prompt Timeout Seconds | Integer | 1200 | 900 | N/A | Time in seconds before a Final prompt closes automatically. |
Prompt Theme | Dropdown | Light | Dark | Dark, Light | Sets the UI theme. |
Header Image | String/Text | https://example.com/logo.png | (blank) | N/A | Local file path or URL for the header image. |
Icon Image | String/Text | /opt/logos/icon.icns | (blank) | N/A | Local file path or URL for the icon image. |
Suppress Time Window | String/Text | 1800-0800 | (blank) | N/A | 24h time range (HHmm-HHmm) to suppress prompts. |
Max Missed Prompts Before Force | Integer | 3 | 0 | N/A | Number of consecutive missed prompts before forcing a reboot without GUI. |
Reboot If Not Logged In | Dropdown | Enable | Disable | Disable, Enable | Enable to reboot immediately if no user is signed in. |
Reboot During Suppress Period | Dropdown | Enable | Disable | Disable, Enable | Fallback default. Allows unattended/forced reboots during suppress windows. |
💡 Note: Do not attempt to change default values by editing the script file directly. Modifying the script may break its execution. Always use Custom Fields or Script Variables to adjust behaviors.
Message Substitution Variables
The following tokens can be used in ANY prompt message - the Regular Prompt Message, the Final Prompt Message, or their custom-field equivalents (cPVAL Reboot Prompt Message / cPVAL Final Prompt Message). Write them in PascalCase with NO surrounding symbols; each is replaced with its live value when the prompt is displayed.
| Token | Description | Example |
|---|---|---|
PromptsToSend | Total prompts the user will receive (regular + final) | 5 |
PromptsSent | Number of prompts shown so far, including the current one | 2 |
PromptsLeft | Remaining prompts before the forced/final one | 3 |
PromptIntervalMinutes | Interval between prompts, in minutes | 240 |
PromptIntervalHours | Same interval, in hours | 4 |
RegularTimeoutSeconds | Regular prompt timeout, in seconds | 600 |
RegularTimeoutMinutes | Same timeout, in minutes | 10 |
FinalTimeoutSeconds | Final prompt timeout, in seconds | 900 |
FinalTimeoutMinutes | Same timeout, in minutes | 15 |
DelayAfterFinalSeconds | Delay after the final prompt before reboot, in seconds | 900 |
DelayAfterFinalMinutes | Same delay, in minutes | 15 |
ScheduledRebootTime | Clock time (HH:MM) of the automatic reboot (now + final delay) | 14:30 |
MinutesUntilReboot | Minutes until the automatic reboot (the final delay) | 10 |
ComputerName | Machine name | MAC-OFFICE-01 |
UserName | Logged-in (console) username | jsmith |
Automation Setup/Import
Output
- Activity Details: Logs the interaction result (e.g., "User declined reboot", "User opted to reboot", or "Final prompt acknowledged").
- Custom Fields: Updates
cPVAL Last Promptedand incrementscPVAL Times Promptedif the user defers. ResetscPVAL Pending Reboot,cPVAL Last Prompted,cPVAL Times Prompted,cPVAL Consecutive Missed Prompts, andcPVAL First Missed Prompt Timeif the reboot is initiated. - User Prompt: Displays the
OmniPromptGUI directly in the console user's session.
Prompt Progression & Message Examples
The script calculates the number of remaining prompts by subtracting the times the user has already been prompted (cPVAL Times Prompted) from the maximum allowed deferrals (cPVAL Reboot Prompt Count). The user sees this count in every message they receive.
Understanding the Count
The first prompt displays the same number as cPVAL Reboot Prompt Count (e.g., 4) because this represents the total "deferrals" available. However, an additional final mandatory prompt is always added after all deferrals are exhausted. This means if you set cPVAL Reboot Prompt Count to 4, the user will receive:
- 4 regular prompts (Yes/No buttons) — user can defer
- 1 final prompt (OK button only) — reboot is mandatory
- Total: 5 prompts before forced reboot
Sample Prompts
Example Configuration:
| Custom Field | Value |
|---|---|
cPVAL Pending Reboot | Yes |
cPVAL Reboot Prompt Count | 5 |
cPVAL Reboot Prompt Title | Restart Required: The Updates Are Getting Impatient |
cPVAL Reboot Prompt Message | Dear UserName, \n\nWe successfully installed some updates. Now, they are demanding a reboot to finish their work. Will you oblige them now, or shall we play this game a few more times?\n\nYou currently have PromptsLeft polite request(s) remaining before we are forced to reboot the machine for you.\n\nIf you choose to ignore this, we will politely bother you again in PromptIntervalHours hour(s). |
cPVAL Reboot Prompt Timeout | 600 |
cPVAL Final Prompt Message | Dear UserName, \n\nWell, this is it. The updates are installed, and we have officially run out of polite requests. This is the absolute final prompt before we take matters into our own hands and restart your computer.\n\nPlease save your work. Once you acknowledge this prompt, the inevitable reboot will occur in DelayAfterFinalMinutes minute(s).\n\nThank you for your cooperation! |
cPVAL Final Prompt Timeout | 900 |
cPVAL Reboot Prompt Theme | Dark |
cPVAL Reboot Prompt Header Image | https://content.provaltech.com/img/logo_r4.png |
cPVAL Reboot Prompt Icon Image | https://www.provaltech.com/favicon.ico |
Prompt 1 (5 remaining):

Prompt 2 (4 remaining):

Prompt 3 (3 remaining):

Prompt 4 (2 remaining):

Prompt 5 (1 remaining):

Prompt 6 (Final - 0 remaining):

macOS Reboot Behavior: Unlike Windows, macOS does not display a shutdown message. When the user clicks "Yes" to reboot, the system will restart approximately one minute later. This delay allows the script sufficient time to update the custom fields before the reboot occurs.
Changelog
2026-07-20
- Initial version of the document.