diff options
author | mail_redacted_for_web | 2019-04-17 19:07:19 +0200 |
---|---|---|
committer | mail_redacted_for_web | 2019-04-17 19:07:19 +0200 |
commit | 1e2387474a449452b78520b9ad96a8b4b5e99722 (patch) | |
tree | 836889471eec7d2aac177405068e2a8f1e2b1978 /nagios-plugins-contrib-24.20190301~bpo9+1/percona-nagios-plugins/nagios/bin/pmp-check-mysql-pidfile | |
download | nagios-plugins-contrib-1e2387474a449452b78520b9ad96a8b4b5e99722.tar.bz2 |
initial commit of source fetch
Diffstat (limited to 'nagios-plugins-contrib-24.20190301~bpo9+1/percona-nagios-plugins/nagios/bin/pmp-check-mysql-pidfile')
-rwxr-xr-x | nagios-plugins-contrib-24.20190301~bpo9+1/percona-nagios-plugins/nagios/bin/pmp-check-mysql-pidfile | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/percona-nagios-plugins/nagios/bin/pmp-check-mysql-pidfile b/nagios-plugins-contrib-24.20190301~bpo9+1/percona-nagios-plugins/nagios/bin/pmp-check-mysql-pidfile new file mode 100755 index 0000000..bd6c0e5 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/percona-nagios-plugins/nagios/bin/pmp-check-mysql-pidfile @@ -0,0 +1,291 @@ +#!/bin/sh + +# ######################################################################## +# This program is part of $PROJECT_NAME$ +# License: GPL License (see COPYING) +# Authors: +# Baron Schwartz +# ######################################################################## + +# ######################################################################## +# Redirect STDERR to STDOUT; Nagios doesn't handle STDERR. +# ######################################################################## +exec 2>&1 + +# ######################################################################## +# Set up constants, etc. +# ######################################################################## +STATE_OK=0 +STATE_WARNING=1 +STATE_CRITICAL=2 +STATE_UNKNOWN=3 +STATE_DEPENDENT=4 + +# ######################################################################## +# Run the program. +# ######################################################################## +main() { + # Get options + for o; do + case "${o}" in + -c) shift; OPT_CRIT="${1}"; shift; ;; + --defaults-file) shift; OPT_DEFT="${1}"; shift; ;; + -H) shift; OPT_HOST="${1}"; shift; ;; + -l) shift; OPT_USER="${1}"; shift; ;; + -L) shift; OPT_LOPA="${1}"; shift; ;; + -p) shift; OPT_PASS="${1}"; shift; ;; + -P) shift; OPT_PORT="${1}"; shift; ;; + -S) shift; OPT_SOCK="${1}"; shift; ;; + -w) shift; OPT_WARN="${1}"; shift; ;; + --version) grep -A2 '^=head1 VERSION' "$0" | tail -n1; exit 0 ;; + --help) perl -00 -ne 'm/^ Usage:/ && print' "$0"; exit 0 ;; + -*) echo "Unknown option ${o}. Try --help."; exit 1; ;; + esac + done + if [ -e '/etc/nagios/mysql.cnf' ]; then + OPT_DEFT="${OPT_DEFT:-/etc/nagios/mysql.cnf}" + fi + if is_not_sourced; then + if [ -n "$1" ]; then + echo "WARN spurious command-line options: $@" + exit 1 + fi + fi + + # Set the exit status in case there are any problems. + NOTE="UNK could not determine the PID file location." + + # Set up files to hold one or more PID file locations. + local TEMP=$(mktemp -t "${0##*/}.XXXXXX") || exit $? + local FILES=$(mktemp -t "${0##*/}.XXXXXX") || exit $? + trap "rm -f '${TEMP}' '${FILES}' >/dev/null 2>&1" EXIT + + # If any connection option was given, then try to log in to find the PID + # file. + if [ "${OPT_DEFT}${OPT_HOST}${OPT_USER}${OPT_PASS}${OPT_PORT}${OPT_SOCK}" ]; then + # If this fails (e.g. we can't log in), then there will be no line in the + # file, and later we won't change the exit code / note away from "UNK". + if mysql_exec "SHOW GLOBAL VARIABLES" > "${TEMP}"; then + get_pidfile "${TEMP}" >> "${FILES}" + fi + else + # Find all MySQL server instances. + for pid in $(_pidof mysqld); do + ps -p ${pid} -o pid,command | grep "${pid}" >> "${TEMP}" + done + # The ${TEMP} file may now contain lines like the following sample: + # 13822 /usr/sbin/mysqld --defaults-file=/var/lib/mysql/my.cnf \ + # --basedir=/usr --datadir=/var/lib/mysql/data/ \ + # --pid-file=/var/run/mysqld/mysqld.pid \ + # --socket=/var/run/mysqld/mysqld.sock + # Now the task is to read find any reference to a --pid-file or --pid_file option. + # We store these into the $FILES temp file. + while read pid command; do + if echo "${command}" | grep pid.file >/dev/null 2>&1; then + # Strip off everything up to and including --pid-file= + command="${command##*--pid?file=}" + # Strip off any options that follow this, assuming that there's not + # a space followed by a dash in the pidfile's path. + echo "${command%% -*}" >> "${FILES}" + fi + done < "${TEMP}" + fi + + # TODO: maybe in the future we can also check whether the PID in the file is + # correct. TODO: maybe we should also alert on which PID is missing its + # pidfile. + MISSING="" + NOTE2="" + while read pidfile; do + if [ ! -e "${pidfile}" ]; then + MISSING=1 + NOTE2="${NOTE2:+${NOTE2}; }missing ${pidfile}" + fi + NOTE="OK all PID files exist." + done < "${FILES}" + + if [ "${MISSING}" ]; then + if [ "${OPT_CRIT}" ]; then + NOTE="CRIT ${NOTE2}" + else + NOTE="WARN ${NOTE2}" + fi + fi + + echo $NOTE +} + +# ######################################################################## +# Execute a MySQL command. +# ######################################################################## +mysql_exec() { + mysql ${OPT_DEFT:+--defaults-file="${OPT_DEFT}"} \ + ${OPT_LOPA:+--login-path="${OPT_LOPA}"} \ + ${OPT_HOST:+-h"${OPT_HOST}"} ${OPT_PORT:+-P"${OPT_PORT}"} \ + ${OPT_USER:+-u"${OPT_USER}"} ${OPT_PASS:+-p"${OPT_PASS}"} \ + ${OPT_SOCK:+-S"${OPT_SOCK}"} -ss -e "$1" +} + +# ######################################################################## +# A wrapper around pidof, which might not exist. The first argument is the +# command name to match. +# ######################################################################## +_pidof() { + if ! pidof "${1}" 2>/dev/null; then + ps axo pid,ucomm | awk -v comm="${1}" '$2 == comm { print $1 }' + fi +} + +# ######################################################################## +# Unfortunately, MySQL 5.0 doesn't have a system variable @@pid_file, so +# we have to use SHOW VARIABLES and a temp file. In 5.1 and newer we +# could have done it in a single SQL statement: +# SELECT IF(@@pid_file LIKE '/%', @@pid_file, +# CONCAT(@@basedir, @@pid_file))" >> "${FILES}" +# The first argument is the file that contains SHOW VARIABLES. +# ######################################################################## +get_pidfile() { + awk ' + /^pid_file/ { pid_file = $2 } + /^basedir/ { basedir = $2 } + END { + if ( substr(pid_file, 1, 1) != "/" ) { + pid_file = basedir pid_file; + } + print pid_file; + } + ' "$1" +} + +# ######################################################################## +# Determine whether this program is being executed directly, or sourced/included +# from another file. +# ######################################################################## +is_not_sourced() { + [ "${0##*/}" = "pmp-check-mysql-pidfile" ] || [ "${0##*/}" = "bash" -a "$_" = "$0" ] +} + +# ######################################################################## +# Execute the program if it was not included from another file. +# This makes it possible to include without executing, and thus test. +# ######################################################################## +if is_not_sourced; then + OUTPUT=$(main "$@") + EXITSTATUS=$STATE_UNKNOWN + case "${OUTPUT}" in + UNK*) EXITSTATUS=$STATE_UNKNOWN; ;; + OK*) EXITSTATUS=$STATE_OK; ;; + WARN*) EXITSTATUS=$STATE_WARNING; ;; + CRIT*) EXITSTATUS=$STATE_CRITICAL; ;; + esac + echo "${OUTPUT}" + exit $EXITSTATUS +fi + +# ############################################################################ +# Documentation +# ############################################################################ +: <<'DOCUMENTATION' +=pod + +=head1 NAME + +pmp-check-mysql-pidfile - Alert when the mysqld PID file is missing. + +=head1 SYNOPSIS + + Usage: pmp-check-mysql-pidfile [OPTIONS] + Options: + -c CRIT Critical threshold; makes a missing PID file critical. + --defaults-file FILE Only read mysql options from the given file. + Defaults to /etc/nagios/mysql.cnf if it exists. + -H HOST MySQL hostname. + -l USER MySQL username. + -L LOGIN-PATH Use login-path to access MySQL (with MySQL client 5.6). + -p PASS MySQL password. + -P PORT MySQL port. + -S SOCKET MySQL socket file. + -w WARN Warning threshold; ignored. + --help Print help and exit. + --version Print version and exit. + Options must be given as --option value, not --option=value or -Ovalue. + Use perldoc to read embedded documentation with more details. + +=head1 DESCRIPTION + +This Nagios plugin checks to make sure that the MySQL PID file is not missing. +The PID file contains the process ID of the MySQL server process, and is used by +init scripts to start and stop the server. If it is deleted for some reason, +then it is likely that the init script will not work correctly. The file can be +deleted by poorly written scripts, an accident, or a mistaken attempt to restart +MySQL while it is already running, especially if mysqld is executed directly +instead of using the init script. + +The plugin accepts the -w and -c options for compatibility with standard Nagios +plugin conventions, but they are not based on a threshold. Instead, the plugin +raises a warning by default, and if the -c option is given, it raises an error +instead, regardless of the option. + +By default, this plugin will attempt to detect all running instances of MySQL, +and verify the PID file's existence for each one. It does this purely by +examining the Unix process table with the C<ps> tool. However, in some cases +the process's command line does not list the path to the PID file. If the tool +fails to detect the MySQL server process, or if you wish to limit the check to a +single instance in the event that there are multiple instances on a single +server, then you can specify MySQL authentication options. This will cause the +plugin to skip examining the Unix processlist, log into MySQL, and examine the +pid_file variable from SHOW VARIABLES to find the location of the PID file. + +=head1 PRIVILEGES + +This plugin executes the following commands against MySQL: + +=over + +=item * + +C<SELECT> the system variables C<@@pid_file> and C<@@basedir>. + +=back + +This plugin executes the following UNIX commands that may need special privileges: + +=over + +=item * + +ps + +=back + +The plugin should be able to either get variables from MySQL or find mysqld +PID using C<ps> command. + +On BSD, if C<sysctl> option C<security.bsd.see_other_uids> is set to 0, C<ps> +will not return mysqld PID if the plugin run from non-root user. + +Also an user you run the plugin from should be able to access MySQL PID file +file, so you may want to add it into mysql unix group etc. + +=head1 COPYRIGHT, LICENSE, AND WARRANTY + +This program is copyright 2012-$CURRENT_YEAR$ Baron Schwartz, 2012-$CURRENT_YEAR$ Percona Inc. +Feedback and improvements are welcome. + +THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, version 2. You should have received a copy of the GNU General +Public License along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +=head1 VERSION + +$PROJECT_NAME$ pmp-check-mysql-pidfile $VERSION$ + +=cut + +DOCUMENTATION |