Translation(s): English - Português (Brasil)


Apcupsd can be used for power management and controlling most of APC’s UPS models, including Smart-UPS models as well as most simple signalling models such as Back-UPS and BackUPS-Office.

During a power failure or other event, apcupsd can execute a script of actions to take, such as broadcast a wall message to all users that there is a power problem, send an email alert or report, or perform an orderly shutdown of affected computer systems.

Installation

Install the apcupsd package. The documentation is available in the apcupsd-doc package.

Configuring (Single UPS Device)

First connect the cable to the server.

To see if your ups is recognized, use the command:

$ lsusb
Bus 001 Device 002: ID 051d:0002 American Power Conversion Back-UPS Pro 500/1000/1500

Daemon

The daemon controls and monitors the status of UPS and allows your computer to run for a specified length of time on UPS power, and then executes a controlled shutdown in the case of an extended power failure.

Before starting the daemon, you must at minimum configure /etc/apcupsd/apcupsd.conf and /etc/default/apcupsd.

In /etc/apcupsd/apcupsd.conf, you must specify the type of UPS:

UPSCABLE : the type of cable connecting the UPS to your computer.
UPSTYPE : the type of UPS you have (USB, RS232,…)
DEVICE : it depend of UPSTYPE

and in /etc/default/apcupsd, you indicate that the configuration is done (not needed with systemd, where it should be enabled as part of /lib/systemd/system/apcupsd.conf or apcupsd@.conf in the case of multiple UPSes).

ISCONFIGURED=yes

Now you can start the daemon with the command:

$ sudo systemctl start apcupsd

The log file /var/log/apcupsd.events says if the daemon has started correctly.

Configuring (Multiple UPS Devices)

The following configuration steps can be used for monitoring one or more UPS devices from one computer. In order to control multiple UPS devices, extra steps must be taken that are not required for monitoring only one UPS.

For multiple UPS monitoring to work, each UPS must be uniquely identifiable and uniquely named on the monitoring computer, separate apcupsd.conf files must be used for each UPS device, and a modified apcupsd init.d script must be used to control multiple apcupsd daemon processes if you are not using systemd.

The UPS devices used as examples below are two APC SmartUPS SUA1500 devices connected to one computer via USB. One UPS is named "UPS Network" and controls power to networking equipment, and the other UPS is named "UPS Server" and controls power to the computer monitoring both UPSes. Each UPS performs different actions for different events.

As of 2024, most modern (Smart-UPS line and up) APC UPSes use the MODBUS protocol, not the older USB protocol, which nowadays is relegated to the lower-end residential market UPSes. Some of the older Smart-UPS still working may use USB or even RS232. This tutorial applies to using multiple USB-type UPSes, and with some modification, the really old RS232-interfaced UPSes.

Connect each UPS and determine they are visible USB devices

$ lsusb
Bus 004 Device 002: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 008 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply

Determine the serial numbers for each UPS

The manufacturer and serial number attributes will be used by udev to uniquely identify each UPS on the system.

$ udevadm info --attribute-walk --name=/dev/bus/usb/004/002 | egrep 'manufacturer|product|serial'
ATTRS{manufacturer}=="American Power Conversion"
ATTRS{product}=="Smart-UPS 1500 FW:601.3.D USB FW:1.3"
ATTRS{serial}=="AS0000000001"

$ udevadm info --attribute-walk --name=/dev/bus/usb/008/003 | egrep 'manufacturer|product|serial'
ATTRS{manufacturer}=="American Power Conversion"
ATTRS{product}=="Smart-UPS 1500 FW:601.3.D USB FW:1.5"
ATTRS{serial}=="AS0000000002"

Create a new udev rules file for the UPS devices. Using the manufacturer and serial number attributes, add a rule for each UPS to create a uniquely named symlink for each UPS. These rules will be automatically run whenever the matching UPS device's USB cable is connected.

$ sudo nano /etc/udev/rules.d/ups.rules

# Network UPS
SUBSYSTEM=="usb", ATTRS{manufacturer}=="American Power Conversion", ATTRS{serial}=="AS0000000001", OWNER="root", SYMLINK+="ups-network"

# Server UPS
SUBSYSTEM=="usb", ATTRS{manufacturer}=="American Power Conversion", ATTRS{serial}=="AS0000000002", OWNER="root", SYMLINK+="ups-server"

Note that the manufacturer argument "American Power Conversion" sometimes ends with a space depending on your UPS, i.e. ATTRS{manufacturer}=="American Power Conversion ". In practice, the serial number will be unique enough across the system that you can omit the ATTRS{manufacturer} argument entirely.

Run the udev rules

$ sudo udevadm control --reload
$ sudo udevadm trigger --v -attr-match=serial="AS0000000001"
$ sudo udevadm trigger --v -attr-match=serial="AS0000000002"

$ ls -l /dev/usb
lrwxrwxrwx 1 root root       7 Aug 30 10:41 ups-network -> /bus/usb/004/002
lrwxrwxrwx 1 root root       7 Aug 30 10:41 ups-server -> /bus/usb/008/003

Set up the apcupsd configuration files

The original apcupsd.conf file needs to be removed and replaced with separate config files for each UPS. The conf files need to be named with a pattern matching apcupsd*.conf or the modified init.d script will not find them.

Each configuration files needs to specify a unique UPSNAME, preferably without spaces, as this is the name used by the modified apcupsd init.d script to control individual apcupsd daemons.

Ensure the configuration directives used during power failures are set up appropriately when there are multiple UPSes. Normally, you probably only want the UPS attached to the computer controlling apcupsd to actually be able to shutdown the computer.

Directives which are important for multiple UPS setups are:

Read the apcupsd manual for more information.

$ sudo nano /etc/apcupsd/apcupsd-network.conf

## apcupsd.conf v1.1 ##
# apcupsd-network.conf
# General Configuration Directives
UPSNAME Network
UPSCABLE usb
UPSTYPE usb /dev/ups-network


POLLTIME 60
#LOCKFILE /var/lock

# Configuration Directives Used by the Network Information Server
NETSERVER on
NISIP 127.0.0.1
NISPORT 3551
EVENTSFILE /var/log/apcupsd-network.events
#EVENTSFILEMAX 10

# Configuration Directives used during Power Failures
BATTERYLEVEL -1
MINUTES -1
TIMEOUT 0
ANNOY 0
ANNOYDELAY 0
NOLOGON disable
#NOLOGONDIR /etc
KILLDELAY 0
SCRIPTDIR /etc/apcupsd/scripts-network
PWRFAILDIR /etc/apcupsd/scripts-network

# Configuration Directives used to Control System Logging
STATTIME 0
#STATFILE /var/log/apcupsd-network.status
DATATIME 0
FACILITY DAEMON

# Configuration Directives for Sharing a UPS
UPSCLASS standalone
UPSMODE disable

$ sudo nano /etc/apcupsd/apcupsd-server.conf

## apcupsd.conf v1.1 ##
# apcupsd-server.conf
# General Configuration Directives
UPSNAME Server
UPSCABLE usb
UPSTYPE usb /dev/ups-server

POLLTIME 60
#LOCKFILE /var/lock

# Configuration Directives Used by the Network Information Server
NETSERVER on
NISIP 127.0.0.1
NISPORT 3552
EVENTSFILE /var/log/apcupsd-server.events
#EVENTSFILEMAX 10

# Configuration Directives used during Power Failures
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 0
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
#NOLOGONDIR /etc
KILLDELAY 0
SCRIPTDIR /etc/apcupsd/scripts-server
PWRFAILDIR /etc/apcupsd

# Configuration Directives used to Control System Logging
STATTIME 0
#STATFILE /var/log/apcupsd-server.status
DATATIME 0
FACILITY DAEMON

# Configuration Directives for Sharing a UPS
UPSCLASS standalone
UPSMODE disable

Create directory(ies) for event handling scripts

Each directory should be for different versions of the scripts. The scripts can be used by one or more UPSes which you want trigger the same actions. However, if one computer is monitoring multiple UPSes, such as one UPS for a server, and another for networking equipment, you probably want to associate different scripts for different actions for each UPS, which requires different script directories and SCRIPTDIR variables set appropriately in each config file. For instance, you probably want to shutdown the server ONLY when the server's UPS triggers an appropriate event.

$ sudo mkdir /etc/apcupsd/scripts-network
$ sudo mkdir /etc/apcupsd/scripts-server

Copy the apccontrol file to each script directory

$ sudo cp /etc/apcupsd/apccontrol /etc/apcupsd/scripts-network
$ sudo cp /etc/apcupsd/apccontrol /etc/apcupsd/scripts-server

Modify apccontrol scripts to perform actions for monitoring events

For example, on the doshutdown event, you might want to send an email, broadcast a wall message, and then run the shutdown command. See the "onbattery" event in the apccontrol script below for an example.

Since these apccontrol scripts were copied to a non-standard location, they should not be modified when the distribution package manager updates apcupsd, so individual event scripts are not required.

Read the apcupsd manual for more information.

$ sudo nano /etc/apcupsd/scripts-server/apccontrol

#
#!/bin/sh
#
# apcupsd apccontrol script for multiple UPSes.
#
# This script will be called by apcupsd when an event is detected and raised.
# In order for apccupd to find this file, the SCRIPTDIR must be set to the
# directory containing this script for each apcupsd UPS configuration file. This
# script must also be named apccontrol and marked as executable.
#
# If different UPSes should perform different actions on events, this script
# should be copied and placed in a different SCRIPTDIR for each UPS, and then
# modified for the specific UPS. Obviously, the SCRIPTDIR needs to be updated
# also in each UPS's configuration file.
#
# Note: All events are still logged to the syslog regardless of the actions
# taken by this script.

SHUTDOWN=/sbin/shutdown
APCUPSD=/sbin/apcupsd
WALL=wall
HOSTNAME=$(hostname -f)

MSGTO="admin@example.com"
SMSTO="admincell@example.com"
MSGFROM="root@${HOSTNAME} <root@${HOSTNAME}>"
MSGSUBJ="${HOSTNAME} apcupsd alert: $1 event"


case "$1" in

killpower)

        eventDesc="Apccontrol issuing 'apcupsd --killpower' to power off UPS ${2}."
        echo "$eventDesc" | $WALL
        sleep 10
        $APCUPSD --killpower
        ;;


annoyme)
        # When a shutdown is scheduled, and the time specified on the ANNOYME
        # directive in the apcupsd.conf file expires, this event is generated.
        # Default action: wall a message

        eventDesc="Warning! Power problems with UPS ${2}. Please logoff."
        echo "$eventDesc" | $WALL
        ;;


changeme)
        # When apcupsd detects that the mains are on, but the battery is not
        # functioning correctly, this event is generated. It is repeated every x
        # hours.
        # Default action: wall a message

        eventDesc="Warning! Batteries have failed on UPS ${2}. Change them NOW!"
        echo "$eventDesc" | $WALL
        ;;


commfailure)
        # This event is generated each time the communications line with the
        # computer is severed. This event is not detected on dumb signaling UPSes.
        # Default action: wall a message

        eventDesc="Communications lost with UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


commok)
        # After a commfailure event is issued, when the communications to the
        # computer is re-established, this event will be generated.
        # Default action: wall a message

        eventDesc="Communications restored with UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


doshutdown|doreboot)
        # When the UPS is running on batteries and one of the limits expires (time,
        # run, load), this event is generated to cause the machine to shutdown.
        # Note: The doreboot event is depreciated and should not be used.
        # Default action: Shuts down the system using shutdown -h or similar

        eventDesc="Warning! UPS $2 initiated shutdown sequence on ${HOSTNAME}."
        echo "$eventDesc" | $WALL
        $SHUTDOWN -h now "apcupsd UPS $2 initiated shutdown"
        ;;


emergency)
        # Called for an emergency system shutdown. (What triggers such a shutdown is
        # unclear...) After completing this event, apcupsd will immediately initiate
        # a doshutdown event.
        # Default action: wall a message

        eventDesc="Warning! Possible battery failure on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


failing)
        # This event is generated when the UPS is running on batteries and the
        # battery power is exhausted. The event following this one will be a
        # shutdown.
        # Default action: wall a message

        eventDesc="Battery power exhaused on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


loadlimit)
        # This event is generated when the battery charge is below the low limit
        # specified in the apcupsd.conf file. After completing this event, apcupsd
        # will immediately initiate a doshutdown event.
        # Default action: wall a message

        eventDesc="Remaining battery charge below limit on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


powerout)
        # This event is generated immediately when apcupsd detects that the UPS has
        # switched to batteries. It may be due to a short powerfailure, an automatic
        # selftest of the UPS, or a longer powerfailure.
        # Default action: nothing

        ;;


onbattery)
        # This event is generated 5 or 6 seconds after an initial powerfailure is
        # detected. It means that apcupsd definitely considers the UPS to be on
        # batteries. The onset of this event can be delayed by the ONBATTERYDELAY
        # apcupsd.conf configuration directive.
        # Default action: wall a message

        eventDesc="Power failure on UPS ${2}. Running on batteries."
        echo "$eventDesc" | $WALL

        status=$(service apcupsd report $2)
        echo "$eventDesc\n\n$status" | mail -r "$MSGFROM" -s "$MSGSUBJ" "$MSGTO"

        status=$(service apcupsd sms $2)
        echo "$status" | mail -r "$MSGFROM" -s "$MSGSUBJ" "$SMSTO"


        #messaging.sprintpcs.com
        ;;


offbattery)
        # This event is generated when the mains return only if the onbattery event
        # has been generated.
        # Default action: wall a message

        eventDesc="Power has returned on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


mainsback)
        # This event is generated when the mains power returns after a powerout
        # condition. The shutdown event may or may not have been generated depending
        # on the parameters you have defined and the length of the power outage.
        # Default action: nothing

        ;;


remotedown)
        # This event is generated on a slave machine when it detects either that the
        # master has shutdown, or that a onbattery situation exists and the
        # communications line has been severed.
        # Default action: wall a message

        eventDesc="Remote shutdown by apcupsd."
        echo "$eventDesc" | $WALL
        ;;


runlimit)
        # This event is generated when the MINUTES value defined in the apcupsd.conf
        # file expires while in a power fail condition. The MINUTES is the remaining
        # runtime as internally calculated by the UPS and monitored by apcupsd.
        # After completing this event, apcupsd will immediately initiate a
        # doshutdown event.
        # Default action: wall a message

        eventDesc="Remaining battery runtime below limit on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


timeout)
        # This event is generated when the TIMEOUT value defined in the apcupsd.conf
        # file expires while in a power fail condition. It indicates that the total
        # time in a power failure has been exceeded and the machine should be
        # shutdown. After completing this event, apcupsd will immediately initiate a
        # doshutdown event.
        # Default action: wall a message

        eventDesc="Battery time limit exceeded on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


startselftest)
        # This event is generated when apcupsd detects a self test by the UPS.
        # Normally due to the 6 second onbattery delay default time, self test
        # events are not detected.
        # Default action: nothing

        eventDesc="Performing self-test on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


endselftest)
        # This event is generated when the end of a self test is detected.
        # Default action: nothing

        eventDesc="Completed self-test on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


battdetach)
        # This event is generated when apcupsd detects that the UPS battery has been
        # disconnected.
        # Default action: nothing

        eventDesc="Battery detached on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


battattach)
        # This event is generated when apcupsd detects that the UPS battery has been
        # reconnected after a battdetach event.
        # Default action: noting

        eventDesc="Battery attached on UPS ${2}."
        echo "$eventDesc" | $WALL
        ;;


*)
        echo "This script is called by apcupsd when UPS events occur."
        ;;

esac

Replace the init.d apcupsd script with one with multiple UPS support (not needed with systemd)

$ sudo mv /etc/init.d/apcupsd /etc/init.d/apcupsd.old
$ sudo nano /etc/init.d/apcupsd

#
#!/bin/sh

### BEGIN INIT INFO
# Provides: apcupsd
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: $local_fs
# Should-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Controls the apcupsd daemon for multiple UPS devices
# Description: apcupsd provides UPS power management for APC products.
### END INIT INFO


# Installation customizable fields.
#USELOCK=false
SUMMARYFIELDS='UPSNAME|MODEL|SERIALNO|STATUS|LINEV|LOADPCT|BCHARGE|TIMELEFT|OUTPUTV|ITEMP|ALARMDEL|BATTV|LINEFREQ|LASTXFER|NUMXFERS|TONBATT|CUMONBATT|BATTDATE|HUMIDITY|AMBTEMP'
SMSFIELDS='UPSNAME|STATUS|BCHARGE|TIMELEFT|LASTXFER|TONBATT'


NAME=apcupsd
DESC="This script controls the apcupsd daemon for multiple UPS devices."
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/sbin/apcupsd
APCTEST=/sbin/apctest
APCACCESS=/sbin/apcaccess
CONFIG=/etc/default/apcupsd
CONFDIR=/etc/apcupsd
RUNDIR=/var/run

. $CONFIG
. /lib/lsb/init-functions

test -x $DAEMON || exit 5
test -x $APCTEST || exit 5
test -x $APCACCESS || exit 5
test -e $CONFIG || exit 5
test -d $CONFDIR || exit 5


if [ "$ISCONFIGURED" != "yes" ]; then
        log_failure_msg "Check your configuration ISCONFIGURED in $CONFIG"
        exit 6  # program is not configured
fi

ls $CONFDIR/apcupsd*.conf > /dev/null 2>&1
statusCode=$?
if [ $statusCode -gt 0 ]; then
        log_failure_msg "No apcupsd configuration files found in $CONFDIR"
        exit 6
fi


case "$1" in
start|stop|restart|force-reload|status|report|summary|sms|test)
        # Each one of these commands are run for all apcupsd configuration files
        # unless a UPSNAME is specified, which will run the command only for
        # that UPS.

        # Note: If a daemon is started, and its conf file is deleted or
        # otherwise can't be found by this script, then this script wont be able
        # to control that daemon.

        if [ "$1" = "start" ]; then
                rm -f $CONFDIR/powerfail
                rm -f /etc/nologin
        fi

        count=0  # Used for white space control in report/summary/sms commands.
        counter=0
        if [ "$1" = "report" ] || [ "$1" = "summary" ] || [ "$1" = "sms" ]; then
                # Count the number of conf files found.
                for conf in $CONFDIR/apcupsd*.conf ; do
                        count=`expr $count + 1`
                done
        fi

        foundUPS=false  # Used only when a UPSNAME is specified.
        errorOccured=false
        statusCode=0
        errorCode=0

        # Loop through the $CONFDIR and find any conf file matching the pattern below.
        for conf in $CONFDIR/apcupsd*.conf ; do
                inst=`basename $conf`
                UPSNAME=$(cat $CONFDIR/$inst | grep "^[^#]" | grep "UPSNAME" | awk '{printf $2}')

                # Check that UPSNAME exists in configuration file.
                if [ -z "$UPSNAME" ]; then
                        log_failure_msg "UPSNAME is not configured in $inst (skipping)"
                        errorOccured=true

                # Continue if either no UPS was specified or the specified UPS was found.
                elif [ -z "$2" ] || ( [ -n "$2" ] && [ "$UPSNAME" = "$2" ] ); then
                        foundUPS=true

                        case "$1" in

                                start)
                                        # Show the daemon's status if it's running.
                                        OUTPUT=$($0 status "$UPSNAME")
                                        returnCode=$?
                                        if [ $returnCode -gt 0 ]; then
                                                log_daemon_msg "Starting UPS monitor (for $UPSNAME UPS)" "apcupsd"
                                        else
                                                echo "$OUTPUT"
                                        fi

                                        start-stop-daemon --start --quiet --oknodo --pidfile $RUNDIR/$inst.pid --exec $DAEMON -- -f $conf -P $RUNDIR/$inst.pid
                                        statusCode=$?

                                        # If the daemon wasn't running, show start result.
                                        # (We still try starting if it wasn't running, just
                                        # in case, but we do it quietly.)
                                        if [ $returnCode -ne 0 ]; then
                                                log_end_msg $statusCode
                                        fi
                                        ;;


                                stop)
                                        # Show the daemon's status if it's not running.
                                        OUTPUT=$($0 status "$UPSNAME")
                                        returnCode=$?
                                        if [ $returnCode -gt 0 ]; then
                                                echo "$OUTPUT"
                                        else
                                                log_daemon_msg "Stopping UPS monitor (for $UPSNAME UPS)" "apcupsd"
                                        fi

                                        start-stop-daemon --stop --quiet --oknodo --pidfile $RUNDIR/$inst.pid
                                        statusCode=$?

                                        # If the daemon was running, show stop result.
                                        # (We still try stopping if it was running, just in
                                        # case, but we do it quietly.)
                                        if [ $returnCode = 0 ]; then
                                                log_end_msg $statusCode
                                        fi
                                        ;;


                                restart|force-reload)
                                        $0 stop "$UPSNAME"
                                        #echo -n "Waiting for just a moment..."
                                        sleep 1
                                        #echo "done."
                                        $0 start "$UPSNAME"
                                        ;;


                                status)
                                        status_of_proc -p $RUNDIR/$inst.pid $DAEMON "UPS monitor (for $UPSNAME UPS)" && statusCode=0 || statusCode=$?
                                        ;;


                                report|summary|sms)
                                        # Report shows full details; summary shows just
                                        # pertinent info; sms shows a very short one liner.
                                        # This code parses the conf file and find the NISPORT
                                        # and NISIP, then display the status of UPS using
                                        # "apcaccess status NISPORT:NISIP" so each UPS needs to
                                        # be configured to have NIS running on a different port.
                                        counter=`expr $counter + 1`
                                        nisport=$(cat $CONFDIR/$inst | grep "^[^#]" | grep "NISPORT" | awk '{printf $2}')
                                        nisip=$(cat $CONFDIR/$inst | grep "^[^#]" | grep "NISIP" | awk '{printf $2}')

                                        if [ "$1" = "summary" ]; then
                                                # Shows only pertinent info.
                                                $APCACCESS status $nisip:$nisport | grep -E $SUMMARYFIELDS

                                        elif [ "$1" = "sms" ]; then
                                                # Produces a short, condensed one line string.
                                                # Note: The output doesn't contain a trailing newline.
                                                $APCACCESS status $nisip:$nisport | grep -E $SMSFIELDS | sed 's/\(^[A-Z]*\)\( *\)\(:\)/\1\3/;s/ *$//;s/ Percent/%/i;s/Minutes/min/i;s/seconds/sec/i;s/UPSNAME:/UPS/;/^STATUS: /s/$/\;/;s/STATUS: //' | tr '\n' ' ' | sed 's/ *$//'

                                        else
                                                # Shows all details.
                                                echo "APCUPSD  : $nisip:$nisport"
                                                echo "CONFFILE : $inst"
                                                $APCACCESS status $nisip:$nisport
                                        fi

                                        if [ -z "$2" ] && [ $count -gt 1 ] && [ $counter -lt $count ]; then
                                                # Only show newline white space if there's more than one
                                                # UPS and it's not the last UPS being shown.
                                                echo
                                        fi
                                        ;;


                                test)
                                        # Runs apctest for a specific UPS. Automatically stops
                                        # apcupsd if it's running and restarts it when finished.

                                        if [ -z "$2" ]; then
                                                log_failure_msg "A specific UPSNAME is required but not provided."
                                                exit 2  # invalid or excess argument(s)
                                        else
                                                # Check if apcupsd is running for this UPS.
                                                $0 status "$UPSNAME" > /dev/null 2>&1
                                                returnCode=$?
                                                if [ $returnCode = 0 ]; then
                                                        $0 stop "$2"
                                                        echo -n "Waiting for just a moment..."
                                                        sleep 3
                                                        echo "done."
                                                fi

                                                $APCTEST -f $conf

                                                # Restart apcupsd if it was running.
                                                if [ $returnCode = 0 ]; then
                                                        $0 start "$2"
                                                fi
                                        fi
                                        ;;

                        esac

                        # Record that a non fatal error occurred somewhere.
                        if [ $statusCode -gt 0 ]; then
                                errorOccured=true
                                errorCode=$statusCode
                                # errorCode may get overridden but only with another error
                                # code, so at the very least the last error code will be
                                # returned (see below).
                        fi

                fi

        done


        # Display an error if a UPS was specified but not found.
        if [ -n "$2" ] && [ "$foundUPS" = "false" ]; then
                log_failure_msg "UPSNAME '$2' not found in any apcupsd configuration file."
                exit 1  # generic or unspecified error

        # If an error code was returned somewhere, exit with it.
        elif [ $errorCode -gt 0 ]; then
                exit $errorCode

        # If any other error occurred, exit with a generic error code.
        elif [ "$errorOccured" = "true" ]; then
                exit 1
        fi

        exit 0  # Everything seems to have finished successfuly!
        ;;


reload|try-restart)
        log_failure_msg "Actions reload and try-restart are not implemented."
        exit 3  # unimplemented feature
        ;;


*)
        N=/etc/init.d/$NAME
        echo $DESC
        echo "Each $CONFDIR/apcupsd*.conf file found will run a separate apcupsd process."
        echo
        echo "Usage: $N {start|stop|restart|status} [UPSNAME]"
        echo "Usage: $N {report|summary|sms} [UPSNAME]"
        echo "Usage: $N test UPSNAME"
        echo
        echo "The start, stop, restart, and status commands control apcupsd processes."
        echo
        echo "The report, summary, and sms commands runs 'apcaccess status'. A report"
        echo "shows full apcaccess status details, summary shows just pertinent info,"
        echo "and sms shows a very short one liner."
        echo
        echo "The test command runs 'apctest' on a specific UPS."
        echo
        echo "The UPSNAME must be set for each UPS in each configuration file."

        exit 2  # invalid or excess argument(s)
        ;;
esac

Mark apcupsd as configured

Edit configuration /etc/default/apcupsd and set the ISCONFIGURED flag.

$ sudo nano /etc/default/apcupsd

ISCONFIGURED=yes

Check UPS status

$ systemctl status apcupsd

or for one of the two multiple UPSes

$ systemctl status apcupsd@network

Alternatively, if NETSERVER is enabled in /etc/apcupsd/apcupsd.conf:

$ sudo apcaccess 

See also


CategoryHardware