UPSSCHED(8)

πŸ’– UPSSCHED(8) πŸ’–

okay so this is upssched from the NUT manual, section 8 β€” the timer helper bestie for scheduling events from upsmon. buckle up, it's actually so good πŸŽ€


✨ NAME ✨

upssched β€” the timer helper that schedules events coming out of upsmon πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹

upssched [OPTIONS] [NOTIFYMSG]
Note: upssched is literally designed to be run from upsmon(8) via the NOTIFYCMD. like, do not run it directly during normal operations, bestie β€” that's not the vibe πŸ™ˆ
upssched -l

This one lists the currently tracked timer events, if there even are any. It reports back as a TAB-separated table of: NAME, TIMEOUT_ABS, TIMEOUT_REL, NOTIFYTYPE, UPSNAME, NOTIFYMSG ✨


🌸 DESCRIPTION 🌸

so upssched was created so you can execute programs at times relative to events being monitored by upsmon(8). the original purpose? letting a shutdown happen after some fixed period on battery πŸ”‹ but there are other uses that are possible too, iykyk.


πŸŽ€ COMMON OPTIONS πŸŽ€

  • -h β€” shows the command-line help message. tiny lil helper 🫢
  • -V β€” shows the NUT version banner. you can get more deets if you also export NUT_DEBUG_LEVEL=1 or a greater verbosity level πŸ‘‘
  • -D β€” raises the debugging level. use this option multiple times for more details, stack 'em πŸ’…

⭐ OPTIONS ⭐

by default, upssched processes its configuration file and executes or queues calls to its CMDSCRIPT, or cancels some previously queued item(s), based on configuration and the NOTIFYTYPE it receives. one exception to this is the queue listing mode -l 🌈

  • -l β€” lists pending timers (if any) and exits. that's it, that's the whole thing ✨
  • NOTIFYMSG β€” optionally pass a text message (typically originates from the upsmon(8) call to upssched as its NOTIFYCMD) as an environment variable named NOTIFYMSG to the CMDSCRIPT launched by upssched immediately or after a timer expires. very demure, very mindful πŸŽ€

πŸ’œ INTEGRATION πŸ’œ

upssched needs to be called as the NOTIFYCMD in your upsmon.conf(5). it figures out what's happening based on the UPSNAME and NOTIFYTYPE environment variables. you should never have to deal with them directly, fr fr.

set the EXEC flag on the events you want to see in upssched. for example, to make sure upssched hears about ONLINE, ONBATT and LOWBATT events, the flags would look like this:

NOTIFYFLAG ONLINE EXEC
NOTIFYFLAG ONBATT EXEC
NOTIFYFLAG LOWBATT EXEC

and if you also want to keep writing to the syslog, just add it in:

NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC

for a full list of notify flags, see the upsmon(8) documentation πŸ‘‘

⚠️ please note that command execution is synchronous (with the called upssched tool process in case of EXECUTE directive, or with the timer process). consider using your system shell abilities like & to send long-duration handling to the background and let the upssched timer daemon continue. this should not impact the upsmon daemon, which handles each notification in a separate sub-process (and so it's not a problem for immediate EXECUTE events) πŸ’€

πŸ“ CONFIGURATION πŸ“

see upssched.conf(5) for info on configuring this program. that's where the magic lives ✨


πŸ”₯ EARLY SHUTDOWNS πŸ”₯

to shut down the system early, define a timer that starts due to an ONBATT condition. when it triggers, make your CMDSCRIPT call your shutdown routine. it should finish by calling upsmon -c fsd so that upsmon gets to shut down the slaves in a controlled manner 🫢

be sure you cancel the timer if power returns (ONLINE). like, please. don't leave it hanging 😭


πŸ‘‘ EARLY PREPARATION FOR A SHUTDOWN ON UPSMON PRIMARY INSTANCE πŸ‘‘

the upsmon(8) primary instance is responsible for telling the UPS(es) to power off at the end of emergency shutdown. as such, if there are several clients, the primary instance raises an "FSD" (Forced Shut Down) flag on the data server for each UPS it manages, and waits for secondary instances to log off (or for a timeout to expire). if there are activities that should happen on the primary upsmon's computer during shutdown which take a long time, you can use the FSD notification to begin those operations while the primary upsmon instance waits for the secondaries to complete their shutdowns ✨

if you have several UPSes, you may want to combine several notifications with the START-TIMER-SHARED directive (with a short timeout), so you only react once. alternately, if the needed activity varies by the UPS (e.g. custom remote-device shutdown scripts), you may actually want to use EXECUTE rules right away (and dispatch further work in your CMDSCRIPT) πŸ’…


🧚 DEBOUNCING EVENTS 🧚

if your UPS goes on and off battery frequently, you can use this program to reduce the number of pager messages that are sent out. rather than sending pages directly from upsmon(8), use a short timer here. if the timer triggers with the UPS still on battery, then send the page. if the power returns before then, the timer can be cancelled and no page is necessary πŸŽ€


🌈 BACKGROUND 🌈

this program was written primarily to fulfill the requests of users for the early shutdown scenario. the "outboard" design of the program (relative to upsmon) was intended to reduce the load on the average system. most people don't have the requirement of shutting down after N seconds on battery, since the usual OB+LB testing is sufficient πŸ’€

this program was created separately so those people don't have to spend CPU time and RAM on something that will never be used in their environments. iconic, honestly πŸ‘‘

the design of the timer handler is also geared towards minimizing impact. it will come and go from the process list as necessary. when a new timer is started, a process will be forked to actually watch the clock and eventually start the CMDSCRIPT. when a timer triggers, it is removed from the queue. cancelling a timer will also remove it from the queue. when no timers are present in the queue, the background process exits ✨

this means you'll only see upssched running when one of two things is happening:

  • there's a timer of some sort currently running
  • upsmon just called it, and you managed to catch the brief instance

the final optimization handles the possibility of trying to cancel a timer when there are none running. if the timer daemon isn't running, there are no timers to cancel, and furthermore there's no need to start a clock-watcher. so, it skips that step and exits sooner πŸ¦‹


πŸ’œ ENVIRONMENT VARIABLES πŸ’œ

NUT_DEBUG_LEVEL sets the default debug verbosity if no -D arguments were provided on the command line, but does not request that the daemon runs in foreground mode.

Note: unlike some other NUT daemons, upssched with enabled debug does not stop reporting on stderr! it forks a background process with the first call as an event handler, which exits soon after all tracked timers have elapsed and were handled (if needed) πŸ™ˆ

UPSNAME and NOTIFYTYPE are required, as detailed above. they're set by upsmon when it calls upssched as its choice of NOTIFYCMD πŸ’…

NUT_CONFPATH is the path name of the directory that contains upssched.conf and other configuration files. if this variable is not set, upssched uses a built-in default, which is often /usr/local/ups/etc πŸŽ€


⭐ FILES ⭐

upssched.conf(5)


πŸ¦‹ SEE ALSO πŸ¦‹

upsmon(8)

🌐 Internet resources:

the NUT (Network UPS Tools) home page: https://www.networkupstools.org/historic/v2.8.5/ πŸ‘‘


πŸ’– that's the whole page bestie, go schedule some timers πŸ’–

signing off with the deets: this was Network UPS Tools 2.8.5, dated 06/21/2026 β€” UPSSCHED(8), periodt πŸŽ€βœ¨

πŸ“¦ where this page comes from
  • arch rolling: nut 2.8.5-2 Β· GPL-2.0-or-later AND GPL-3.0-or-later
  • πŸ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms