When managing Nagios 3.5.1 in production environments, we often schedule maintenance windows for system updates. The default 2-hour downtime window becomes problematic when maintenance completes earlier - leaving alerting disabled unnecessarily. Here's how to proactively cancel scheduled downtime through Nagios' external command interface.
First, check currently active downtimes using the downtime file or web interface:
# View current downtimes cat /usr/local/nagios/var/retention.dat | grep "downtime {" -A 8
Or through the web UI: Status → Scheduled Downtime (shown in your screenshots). Note the downtime_id for the entry you want to cancel.
Nagios processes external commands through the command file. Here's the exact syntax to cancel downtime:
# Format for cancelling host downtime echo "[TIMESTAMP] DEL_HOST_DOWNTIME;DOWNTIME_ID" > /usr/local/nagios/var/rw/nagios.cmd # Example for cancelling downtime ID 12345 echo "[$(date +%s)] DEL_HOST_DOWNTIME;12345" > /usr/local/nagios/var/rw/nagios.cmd
For WordPress/Drupal maintenance scenarios, create a cancellation script (cancel_downtime.sh):
#!/bin/bash NAGIOS_CMD_FILE="/usr/local/nagios/var/rw/nagios.cmd" DOWNTIME_ID=$1 if [ -z "$DOWNTIME_ID" ]; then echo "Usage: $0 <downtime_id>" exit 1 fi TIMESTAMP=$(date +%s) echo "[$TIMESTAMP] DEL_HOST_DOWNTIME;$DOWNTIME_ID" > $NAGIOS_CMD_FILE logger "Cancelled Nagios downtime ID $DOWNTIME_ID"
Check the nagios.log for confirmation:
tail -f /usr/local/nagios/var/nagios.log | grep -i "downtime"
You should see entries like:
[1620000000] EXTERNAL COMMAND: DEL_HOST_DOWNTIME;12345
[1620000001] Caught SIGCHLD: A command was executed (PID=1234)
For newer Nagios installations with API access:
curl -XPOST "http://nagios.example.com/nagios/cgi-bin/cmd.cgi" \ -d "cmd_typ=79" \ -d "cmd_mod=2" \ -d "down_id=12345" \ -u "nagiosadmin:password"
• Command file location may vary (/var/lib/nagios3/rw/nagios.cmd on Debian)
• The nagios.cmd pipe requires proper permissions (usually nagios:nagios)
• For service-specific downtime, use DEL_SVC_DOWNTIME instead
• Changes take effect after the next Nagios event cycle (typically 30 seconds)
When managing maintenance windows in Nagios 3.5.1, scheduled downtime is typically set using either:
- The web interface (as shown in your screenshots)
- Command-line tools via external commands
From the Nagios web console:
1. Navigate to "Scheduled Downtime" under the "System" menu
2. Locate your active downtime entry (filter by host/service if needed)
3. Click the "Delete" icon (trash can) next to the downtime entry
4. Confirm the deletion in the pop-up dialog
For scriptable solutions or remote administration, use the external command file:
# Syntax for canceling host downtime
echo "[TIMESTAMP] DEL_HOST_DOWNTIME;DOWNTIME_ID" >> /usr/local/nagios/var/rw/nagios.cmd
# Example for canceling downtime ID 1234
echo "date +%s DEL_HOST_DOWNTIME;1234" >> /var/lib/nagios3/rw/nagios.cmd
To programmatically retrieve active downtime IDs:
# Query current downtimes (JSON output format)
curl -s "http://nagios-server/nagios/cgi-bin/statusjson.cgi?query=downtimelist" | jq '.data.downtimelist[] | select(.is_in_effect=="1")'
For Drupal/WordPress maintenance scenarios:
<?php
function cancel_nagios_downtime($hostname) {
$downtime_id = shell_exec("curl -s 'http://nagios/nagios/cgi-bin/statusjson.cgi?query=downtimelist&hostname=$hostname' | jq -r '.data.downtimelist[] | select(.is_in_effect==\"1\") | .id'");
if (!empty($downtime_id)) {
$cmd = "echo \"date +%s DEL_HOST_DOWNTIME;$downtime_id\" >> /var/lib/nagios3/rw/nagios.cmd";
shell_exec($cmd);
return "Cancelled downtime ID: $downtime_id";
}
return "No active downtime found";
}
?>
After executing either method, verify success by:
- Checking the web interface's "Downtime" view
- Reviewing nagios.log for the cancellation event
- Running
service nagios status
to confirm no errors