Skip to main content

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.

Optionally, the final warning can hand the decision back to the user: with the reboot scheduler enabled they pick their own restart time and receive a reminder shortly before it arrives. See Reboot Scheduler & Pre-Reboot Reminder.

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:

SignalWhat It Means
softwareupdatemacOS Software Update is actively installing an update
installA general macOS installer package is running
msudmacOS Software Update Daemon is active
setupdmacOS Setup Assistant or installer is running
osinstallersetupdmacOS 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.

Reboot Scheduler & Pre-Reboot Reminder​

By default the final prompt is a single acknowledgement: the user clicks OK and the restart follows after the configured grace period. The optional scheduler changes that last step, letting the user choose their own restart time instead.

The feature is controlled entirely by cPVAL Reboot Schedule Max Hours:

ValueBehaviour of the Final Prompt
0 or blankUnchanged. A single OK button, and the restart follows cPVAL Final Prompt Reboot Delay Minutes.
Greater than 0A date and time picker is shown alongside a Schedule Reboot button, covering everything from now to this many hours ahead.

How a scheduled restart plays out​

  1. The user picks a time on the final prompt and clicks Schedule Reboot. The choice is written to cPVAL Scheduled Reboot Time, the prompt cycle is marked complete, and the script exits without restarting anything.
  2. The device is left alone while it waits. The Detection automation deliberately stops detecting it, so no further prompts appear for a restart the user has already agreed to.
  3. The reminder appears once the chosen time comes within cPVAL Reboot Reminder Lead Minutes. It states the real restart time and the actual minutes remaining, and carries a single acknowledgement button.
  4. The restart happens at the moment the user selected. The script clears every tracking field, stamps cPVAL Reboot Reminder Sent Time, and waits out the remaining time and then issues the restart with a one minute countdown.

Because macOS has no scheduled task equivalent, the script stays running while the reminder is on screen and until the restart is issued. The automation timeout for this script must therefore be longer than cPVAL Reboot Reminder Lead Minutes.

A few edge cases are handled deliberately:

  • A time that has already passed, or one already inside the reminder window, is treated as "restart now" rather than scheduled. The earliest option the picker offers is the current time, so this is the honest reading of the choice.
  • A device switched off through its scheduled time is picked up as overdue on its next check-in and restarts late rather than never.
  • An installation in progress when the reminder falls due pushes the scheduled time forward by one reminder window instead of restarting through the install.
  • A cancelled countdown (the user runs shutdown /a, or a policy aborts it) is noticed after 60 minutes, and the device returns to the normal prompt cycle.

⚠️ Important: cPVAL Reboot Reminder Lead Minutes must be set to the same value on both this Autofix automation and the Detection automation. The Detection automation decides when a scheduled restart is due for its reminder, and this script sizes the countdown from it.

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.
  • OmniPrompt is a cross-platform, Go-based GUI utility that runs natively on macOS without requiring any external runtimes (like .NET).

Dependencies​

Custom Fields​

Custom FieldTypeExampleScopeAvailable OptionsEditableDescription
cPVAL Reboot Prompt CountNumeric5Organization, Location, DeviceN/AYesMax deferrals allowed before a forced reboot.
cPVAL Reboot Prompt Duration Between PromptNumeric4Organization, Location, DeviceN/AYesMinimum hours to wait between prompts.
cPVAL Reboot Prompt TitleTextIT Dept: Important UpdatesOrganization, Location, DeviceN/AYesTitle of the GUI window.
cPVAL Reboot Prompt MessageMulti-lineWe installed security patches.Organization, Location, DeviceN/AYesCustom message body. Supports message substitution variables.
cPVAL Final Prompt MessageMulti-lineDeferrals exhausted.Organization, Location, DeviceN/AYesMessage displayed when no deferrals remain. Supports message substitution variables.
cPVAL Reboot Prompt TimeoutNumeric600Organization, Location, DeviceN/AYesTime in seconds before a "Warning" prompt closes automatically.
cPVAL Final Prompt TimeoutNumeric900Organization, Location, DeviceN/AYesTime in seconds before a "Final" prompt closes automatically.
cPVAL Final Prompt Reboot Delay MinutesNumeric10Organization, Location, DeviceN/AYesGrace period (in minutes) after final acknowledgment before the forced reboot occurs.
cPVAL Reboot Prompt Header ImageTexthttps://example.com/logo.pngOrganization, Location, DeviceN/AYesLocal file path or URL for the header image.
cPVAL Reboot Prompt Icon ImageTextC:\Logos\icon.icoOrganization, Location, DeviceN/AYesLocal file path or URL for the icon image.
cPVAL Reboot Prompt ThemeDropdownDarkOrganization, Location, DeviceDark, LightYesUI Theme: "Dark" or "Light".
cPVAL Reboot if Not Logged InDropdownEnableOrganization, Location, DeviceDisable, EnableYesForces reboot immediately if no user session is active.
cPVAL Reboot During Suppress PeriodDropdownEnableOrganization, Location, DeviceDisable, EnableYesAllows unattended/forced reboots during suppress windows or weekends.
cPVAL Reboot Prompt Suppress Time WindowText1800-0800Organization, Location, DeviceN/AYes24-hour time range (HHmm-HHmm) to suppress prompts. Leave blank to disable.
cPVAL Max Missed Prompts Before ForceNumeric3Organization, Location, DeviceN/AYesNumber of consecutive missed prompts before forcing a reboot without showing the GUI. Set to 0 to disable.
cPVAL Reboot Prompt SizeText640x480Organization, Location, DeviceN/AYesSize of the prompt window (WIDTHxHEIGHT).
cPVAL Reboot Prompt Text Box SizeText500x200Organization, Location, DeviceN/AYesSize of the text box (WIDTHxHEIGHT).
cPVAL Reboot Prompt Logo SizeText400x150Organization, Location, DeviceN/AYesSize of the logo (WIDTHxHEIGHT).
cPVAL Reboot Prompt Text SizeNumeric14Organization, Location, DeviceN/AYesFont size for the message text.
cPVAL Reboot Prompt Text StyleTextArialOrganization, Location, DeviceN/AYesFont family for the message text.
cPVAL Reboot Prompt Button Text StyleTextArialOrganization, Location, DeviceN/AYesFont family for button text.
cPVAL Reboot Prompt Button Text SizeNumeric14Organization, Location, DeviceN/AYesFont size for button text.
cPVAL Reboot Prompt Button SizeText100x40Organization, Location, DeviceN/AYesSize of each button (WIDTHxHEIGHT).
cPVAL Reboot Prompt Title Text StyleTextArialOrganization, Location, DeviceN/AYesFont family for the title bar text.
cPVAL Reboot Prompt Title Text SizeNumeric14Organization, Location, DeviceN/AYesFont size for the title bar text.
cPVAL Reboot Prompt Title Field SizeText640x35Organization, Location, DeviceN/AYesSize of the title bar (WIDTHxHEIGHT).
cPVAL Last PromptedText2024-05-20 14:30:00DeviceN/ANoUpdated to current timestamp if user defers. Updated by script.
cPVAL Times PromptedNumeric2DeviceN/ANoIncremented by 1 if user defers. Resets to 0 on Reboot. Updated by script.
cPVAL Pending RebootCheckboxFalseDeviceTrue, FalseYesSet to False upon successful reboot initiation. Updated by script.
cPVAL Consecutive Missed PromptsNumeric2DeviceN/ANoTracks consecutive missed prompts. Managed by the Detection script and reset on reboot.
cPVAL First Missed Prompt TimeText2024-05-20 14:30:00DeviceN/ANoRecords when the current missed-prompt streak started. Managed by the Detection script and reset on reboot.
cPVAL Reboot Schedule Max HoursNumeric48Organization, Location, DeviceN/AYesMaximum hours ahead the user may schedule their restart on the final prompt. Set to 0 to disable the scheduler and the reminder entirely.
cPVAL Reboot Reminder Lead MinutesNumeric15Organization, Location, DeviceN/AYesHow many minutes ahead of a scheduled restart the reminder appears and the countdown begins. Must match the Detection value.
cPVAL Reboot Reminder Prompt TitleTextRestart Starting SoonOrganization, Location, DeviceN/AYesTitle of the pre-reboot reminder window.
cPVAL Reboot Reminder Prompt MessageMulti-lineYour restart begins at ScheduledRebootTime.Organization, Location, DeviceN/AYesMessage body of the pre-reboot reminder. Supports message substitution variables. Avoid using single quotation marks (') in the message.
cPVAL Scheduled Reboot TimeText2026-09-09 14:30:00DeviceN/ANoThe restart time the user selected. Written when a restart is scheduled and cleared once the reminder fires. Updated by script.
cPVAL Reboot Reminder Sent TimeText2026-09-09 14:15:00DeviceN/ANoRecords when the reminder was sent and the countdown began. A value here means a restart is already pending. Updated by script.

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.

PriorityLevelDescription
1 (Highest)Device Level Custom FieldOverrides all lower levels. Applied to a specific endpoint.
2Location Level Custom FieldOverrides Organization level. Applied to all endpoints in a location.
3Organization Level Custom FieldGlobal default for the entire tenant.
4 (Lowest)Script Runtime VariableUltimate 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.

NameTypeExampleDefaultAvailable OptionsDescription
Prompt TitleString/TextAction RequiredUpdates Installed - Reboot RequiredN/ATitle of the GUI window.
Regular Prompt MessageString/TextSecurity updates applied.Built-in standard messageN/ADefault message for regular prompts. Supports message substitution variables.
Final Prompt MessageString/TextFinal warning.Built-in final warning messageN/ADefault message for final prompts. Supports message substitution variables.
Prompt CountInteger54N/AMax deferrals allowed before a forced reboot.
Final Reboot Delay MinutesInteger105N/AGrace period after final acknowledgment.
Duration Between PromptsInteger64N/AMinimum hours to wait between prompts.
Regular Prompt Timeout SecondsInteger600300N/ATime in seconds before a Warning prompt closes automatically.
Final Prompt Timeout SecondsInteger1200900N/ATime in seconds before a Final prompt closes automatically.
Prompt ThemeDropdownLightDarkDark, LightSets the UI theme.
Header ImageString/Texthttps://example.com/logo.png(blank)N/ALocal file path or URL for the header image.
Icon ImageString/Text/opt/logos/icon.icns(blank)N/ALocal file path or URL for the icon image.
Suppress Time WindowString/Text1800-0800(blank)N/A24h time range (HHmm-HHmm) to suppress prompts.
Max Missed Prompts Before ForceInteger30N/ANumber of consecutive missed prompts before forcing a reboot without GUI.
Reboot If Not Logged InDropdownEnableDisableDisable, EnableEnable to reboot immediately if no user is signed in.
Reboot During Suppress PeriodDropdownEnableDisableDisable, EnableFallback default. Allows unattended/forced reboots during suppress windows.
Reboot Schedule Max HoursInteger480N/AMaximum hours ahead the user may schedule their restart on the final prompt. 0 disables the scheduler and the reminder.
Reboot Reminder Lead MinutesInteger1515N/AHow many minutes ahead of a scheduled restart the reminder appears. Must match the Detection value.
Reminder Prompt TitleString/TextRestart Starting SoonReboot Required - Starting SoonN/ATitle of the pre-reboot reminder window.
Reminder Prompt MessageString/TextYour restart begins shortly.Built-in reminder messageN/ADefault message for the pre-reboot reminder. Supports message substitution variables.

💡 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, the Reminder Prompt Message, or their custom-field equivalents. Write them in PascalCase with NO surrounding symbols; each is replaced with its live value when the prompt is displayed.

TokenDescriptionExample
PromptsToSendTotal prompts the user will receive (regular + final)5
PromptsSentNumber of prompts shown so far, including the current one2
PromptsLeftRemaining prompts before the forced/final one3
PromptIntervalMinutesInterval between prompts, in minutes240
PromptIntervalHoursSame interval, in hours4
NextPromptTimeDate and time the next prompt will appear if the user defersWed 09 Sep, 6:30 PM
RegularTimeoutSecondsRegular prompt timeout, in seconds600
RegularTimeoutMinutesSame timeout, in minutes10
FinalTimeoutSecondsFinal prompt timeout, in seconds900
FinalTimeoutMinutesSame timeout, in minutes15
DelayAfterFinalSecondsDelay after the final prompt before reboot, in seconds900
DelayAfterFinalMinutesSame delay, in minutes15
ScheduledRebootTimeClock time (HH:mm) of the automatic reboot. On a regular or final prompt this is now plus the final delay; on the pre-reboot reminder it is the real time the user selected14:30
MinutesUntilRebootMinutes until the automatic reboot. On a regular or final prompt this is the final delay; on the pre-reboot reminder it is the actual minutes remaining10
ScheduleMaxHoursHow many hours ahead the user may schedule their restart48
ScheduleMaxDaysThe same window expressed in whole days2
ScheduleWindowEndDate and time of the latest moment the user may selectFri 11 Sep, 2:30 PM
ReminderLeadMinutesHow many minutes of warning the user gets before a scheduled restart15
UptimeDaysWhole days the machine has been running since its last restart23
LastRebootTimeDate and time the machine was last restarted2026-08-17 09:14
ComputerNameMachine namePC-OFFICE-01
UserNameLogged-in usernamejsmith

💡 Which tokens suit which prompt. Every token resolves on every prompt, but some only make sense in certain places. ScheduleMaxHours, ScheduleMaxDays and ScheduleWindowEnd belong on the final prompt when the scheduler is enabled, since that is where the user chooses a time. ReminderLeadMinutes reads naturally on the final prompt too, as a promise of the nudge to come. NextPromptTime belongs on regular prompts, where deferring is still an option. On the pre-reboot reminder there is no window left to choose from and no further prompt to come, so ScheduleWindowEnd and NextPromptTime both resolve to the scheduled restart itself.

💡 Keeping messages honest. Prefer ScheduleMaxHours or ScheduleMaxDays over writing the window into the message as prose. A message that says "within the next two days" becomes wrong the moment someone changes cPVAL Reboot Schedule Max Hours, whereas ScheduleMaxDays follows it automatically. ScheduleMaxDays rounds at the half-day mark, so 36 hours reads as 2 days; for any window under 12 hours it resolves to 0, so use ScheduleMaxHours for short windows.

💡 Note: UptimeDays and LastRebootTime are read from the operating system at display time. If either cannot be determined the token resolves to an empty string rather than failing the prompt, so avoid building a sentence that reads oddly when the value is missing.

Automation Setup/Import​

Automation Configuration

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 Prompted and increments cPVAL Times Prompted if the user defers. Resets cPVAL Pending Reboot, cPVAL Last Prompted, cPVAL Times Prompted, cPVAL Consecutive Missed Prompts, and cPVAL First Missed Prompt Time if the reboot is initiated. Writes cPVAL Scheduled Reboot Time when a user schedules their restart, and stamps cPVAL Reboot Reminder Sent Time when the reminder is sent and the countdown begins.
  • User Prompt: Displays the OmniPrompt GUI 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

💡 Note: When the reboot scheduler is enabled through cPVAL Reboot Schedule Max Hours, the final prompt becomes a scheduling prompt rather than a plain acknowledgement, and one further pre-reboot reminder is shown shortly before the restart the user chose. The number of regular prompts is unaffected.

Sample Prompts​

Example Configuration: Standard Final Prompt​

Custom FieldValue
cPVAL Pending RebootYes
cPVAL Reboot Prompt Count5
cPVAL Reboot Schedule Max Hours0 (scheduler disabled)
cPVAL Reboot Prompt TitleRestart Required: The Updates Are Getting Impatient
cPVAL Reboot Prompt MessageDear 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 Timeout600
cPVAL Final Prompt MessageDear 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 Timeout900
cPVAL Reboot Prompt ThemeDark
cPVAL Reboot Prompt Header Imagehttps://content.provaltech.com/img/logo_r4.png
cPVAL Reboot Prompt Icon Imagehttps://www.provaltech.com/favicon.ico

Prompt 1 (5 remaining):
Image1

Prompt 2 (4 remaining):
Image2

Prompt 3 (3 remaining):
Image3

Prompt 4 (2 remaining):
Image4

Prompt 5 (1 remaining):
Image5

Prompt 6 (Final - 0 remaining):
Image6

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.

Example Configuration: Scheduled Final Prompt​

The configuration above ends with a plain acknowledgement because cPVAL Reboot Schedule Max Hours is 0. Raise it above zero and the last prompt hands the decision to the user instead, followed by a reminder shortly before their chosen moment arrives.

Custom FieldValue
cPVAL Pending RebootYes
cPVAL Reboot Prompt Count5
cPVAL Reboot Schedule Max Hours48
cPVAL Reboot Reminder Lead Minutes15
cPVAL Reboot Prompt TitleRestart Required: The Updates Are Getting Impatient
cPVAL Final Prompt MessageDear UserName, \n\nWe have officially run out of polite requests, so we are handing you the calendar instead. Pick any moment that suits you within the next ScheduleMaxDays days, and your computer will restart precisely then.\n\nChoose a time and click Schedule Reboot. We will tap you on the shoulder ReminderLeadMinutes minute(s) beforehand, so nothing arrives as a surprise.\n\nThank you for your cooperation\!
cPVAL Final Prompt Timeout900
cPVAL Reboot Reminder Prompt TitleRestart Incoming: The Moment You Chose Has Nearly Arrived
cPVAL Reboot Reminder Prompt MessageDear UserName, \n\nRemember that restart time you so carefully selected? It is very nearly here. Your Mac will restart at ScheduledRebootTime, which is MinutesUntilReboot minute(s) away.\n\nPlease save your work now. This one is a courtesy heads-up rather than a question, so there is nothing to reply to.\n\nThank you for your cooperation\!
cPVAL Reboot Prompt ThemeDark
cPVAL Reboot Prompt Header Imagehttps://content.provaltech.com/img/logo_r4.png
cPVAL Reboot Prompt Icon Imagehttps://www.provaltech.com/favicon.ico

Prompts 1 through 5 are identical to the examples above. Only the final prompt changes, and a reminder is added:

Prompt 6 (Final - user picks a restart time):
Image7

Pre-Reboot Reminder (shown shortly before the chosen time):
Image8

Changelog​

2026-09-09​

  • Added the optional reboot scheduler. When cPVAL Reboot Schedule Max Hours is greater than 0, the final prompt presents a date and time picker so the user can choose their own restart time, and a pre-reboot reminder is shown shortly before it arrives.
  • Added the new custom fields cPVAL Reboot Schedule Max Hours, cPVAL Reboot Reminder Lead Minutes, cPVAL Reboot Reminder Prompt Title, cPVAL Reboot Reminder Prompt Message, cPVAL Scheduled Reboot Time, and cPVAL Reboot Reminder Sent Time.
  • Added the new script variables Reboot Schedule Max Hours, Reboot Reminder Lead Minutes, Reminder Prompt Title, and Reminder Prompt Message.
  • Leaving cPVAL Reboot Schedule Max Hours at 0 keeps the previous behaviour exactly, with no scheduler and no reminder.
  • The ScheduledRebootTime and MinutesUntilReboot substitution variables now resolve to the real restart time and the actual minutes remaining when used on the pre-reboot reminder.
  • The reminder prompt is displayed in the foreground, matching how the regular and final prompts are shown, which is the only invocation reliably rendered on macOS.
  • The restart is issued with a one minute countdown so the agent has time to save the custom field updates before the machine goes down. The wait beforehand is shortened by the same minute, so the restart still lands on the time the user selected.
  • The tracking fields are cleared immediately before the restart. If the script is interrupted while the reminder is on screen, the scheduled time survives and the next cycle retries, so an interrupted run becomes a late restart rather than a lost one.

2026-07-20​

  • Initial version of the document.