Skip to content

Instantly share code, notes, and snippets.

@stefanandres
Created December 18, 2014 10:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stefanandres/10ceddcb4c0ce63c1647 to your computer and use it in GitHub Desktop.
Save stefanandres/10ceddcb4c0ce63c1647 to your computer and use it in GitHub Desktop.
/etc/init.d/mysql:#!/bin/bash
/etc/init.d/mysql:#
/etc/init.d/mysql:### BEGIN INIT INFO
/etc/init.d/mysql:# Provides: mysql
/etc/init.d/mysql:# Required-Start: $remote_fs $syslog
/etc/init.d/mysql:# Required-Stop: $remote_fs $syslog
/etc/init.d/mysql:# Should-Start: $network $time
/etc/init.d/mysql:# Should-Stop: $network $time
/etc/init.d/mysql:# Default-Start: 2 3 4 5
/etc/init.d/mysql:# Default-Stop: 0 1 6
/etc/init.d/mysql:# Short-Description: Start and stop the mysql database server daemon
/etc/init.d/mysql:# Description: Controls the main MySQL database server daemon "mysqld"
/etc/init.d/mysql:# and its wrapper script "mysqld_safe".
/etc/init.d/mysql:### END INIT INFO
/etc/init.d/mysql:#
/etc/init.d/mysql:set -e
/etc/init.d/mysql:set -u
/etc/init.d/mysql:${DEBIAN_SCRIPT_DEBUG:+ set -v -x}
/etc/init.d/mysql:test -x /usr/bin/mysqld_safe || exit 0
/etc/init.d/mysql:. /lib/lsb/init-functions
/etc/init.d/mysql:SELF=$(cd $(dirname $0); pwd -P)/$(basename $0)
/etc/init.d/mysql:CONF=/etc/mysql/my.cnf
/etc/init.d/mysql:MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
/etc/init.d/mysql:# priority can be overriden and "-s" adds output to stderr
/etc/init.d/mysql:ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i"
/etc/init.d/mysql:# Safeguard (relative paths, core dumps..)
/etc/init.d/mysql:cd /
/etc/init.d/mysql:umask 077
/etc/init.d/mysql:# mysqladmin likes to read /root/.my.cnf. This is usually not what I want
/etc/init.d/mysql:# as many admins e.g. only store a password without a username there and
/etc/init.d/mysql:# so break my scripts.
/etc/init.d/mysql:export HOME=/etc/mysql/
/etc/init.d/mysql:## Fetch a particular option from mysql's invocation.
/etc/init.d/mysql:#
/etc/init.d/mysql:# Usage: void mysqld_get_param option
/etc/init.d/mysql:mysqld_get_param() {
/etc/init.d/mysql: /usr/sbin/mysqld --print-defaults \
/etc/init.d/mysql: | tr " " "\n" \
/etc/init.d/mysql: | grep -- "--$1" \
/etc/init.d/mysql: | tail -n 1 \
/etc/init.d/mysql: | cut -d= -f2
/etc/init.d/mysql:}
/etc/init.d/mysql:## Do some sanity checks before even trying to start mysqld.
/etc/init.d/mysql:sanity_checks() {
/etc/init.d/mysql: # check for config file
/etc/init.d/mysql: if [ ! -r /etc/mysql/my.cnf ]; then
/etc/init.d/mysql: log_warning_msg "$0: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz"
/etc/init.d/mysql: echo "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
/etc/init.d/mysql: fi
/etc/init.d/mysql: # check for diskspace shortage
/etc/init.d/mysql: datadir=`mysqld_get_param datadir`
/etc/init.d/mysql: if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit ($4>4096) }'; then
/etc/init.d/mysql: log_failure_msg "$0: ERROR: The partition with $datadir is too full!"
/etc/init.d/mysql: echo "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER
/etc/init.d/mysql: exit 1
/etc/init.d/mysql: fi
/etc/init.d/mysql:}
/etc/init.d/mysql:## Checks if there is a server running and if so if it is accessible.
/etc/init.d/mysql:#
/etc/init.d/mysql:# check_alive insists on a pingable server
/etc/init.d/mysql:# check_dead also fails if there is a lost mysqld in the process list
/etc/init.d/mysql:#
/etc/init.d/mysql:# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
/etc/init.d/mysql:mysqld_status () {
/etc/init.d/mysql: ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))
/etc/init.d/mysql: ps_alive=0
/etc/init.d/mysql: pidfile=`mysqld_get_param pid-file`
/etc/init.d/mysql: if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
/etc/init.d/mysql:
/etc/init.d/mysql: if [ "$1" = "check_alive" -a $ping_alive = 1 ] ||
/etc/init.d/mysql: [ "$1" = "check_dead" -a $ping_alive = 0 -a $ps_alive = 0 ]; then
/etc/init.d/mysql: return 0 # EXIT_SUCCESS
/etc/init.d/mysql: else
/etc/init.d/mysql: if [ "$2" = "warn" ]; then
/etc/init.d/mysql: echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
/etc/init.d/mysql: fi
/etc/init.d/mysql: return 1 # EXIT_FAILURE
/etc/init.d/mysql: fi
/etc/init.d/mysql:}
/etc/init.d/mysql:#
/etc/init.d/mysql:# main()
/etc/init.d/mysql:#
/etc/init.d/mysql:case "${1:-''}" in
/etc/init.d/mysql: 'start')
/etc/init.d/mysql: sanity_checks;
/etc/init.d/mysql: # Start daemon
/etc/init.d/mysql: log_daemon_msg "Starting MySQL database server" "mysqld"
/etc/init.d/mysql: if mysqld_status check_alive nowarn; then
/etc/init.d/mysql: log_progress_msg "already running"
/etc/init.d/mysql: log_end_msg 0
/etc/init.d/mysql: else
/etc/init.d/mysql: # Could be removed during boot
/etc/init.d/mysql: test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld
/etc/init.d/mysql: # Start MySQL!
/etc/init.d/mysql: /usr/bin/mysqld_safe > /dev/null 2>&1 &
/etc/init.d/mysql: # 6s was reported in #352070 to be too few when using ndbcluster
/etc/init.d/mysql: # 14s was reported in #736452 to be too few with large installs
/etc/init.d/mysql: for i in $(seq 1 30); do
/etc/init.d/mysql: sleep 1
/etc/init.d/mysql: if mysqld_status check_alive nowarn ; then break; fi
/etc/init.d/mysql: log_progress_msg "."
/etc/init.d/mysql: done
/etc/init.d/mysql: if mysqld_status check_alive warn; then
/etc/init.d/mysql: log_end_msg 0
/etc/init.d/mysql: # Now start mysqlcheck or whatever the admin wants.
/etc/init.d/mysql: output=$(/etc/mysql/debian-start)
/etc/init.d/mysql: [ -n "$output" ] && log_action_msg "$output"
/etc/init.d/mysql: else
/etc/init.d/mysql: log_end_msg 1
/etc/init.d/mysql: log_failure_msg "Please take a look at the syslog"
/etc/init.d/mysql: fi
/etc/init.d/mysql: fi
/etc/init.d/mysql: ;;
/etc/init.d/mysql: 'stop')
/etc/init.d/mysql: # * As a passwordless mysqladmin (e.g. via ~/.my.cnf) must be possible
/etc/init.d/mysql: # at least for cron, we can rely on it here, too. (although we have
/etc/init.d/mysql: # to specify it explicit as e.g. sudo environments points to the normal
/etc/init.d/mysql: # users home and not /root)
/etc/init.d/mysql: log_daemon_msg "Stopping MySQL database server" "mysqld"
/etc/init.d/mysql: if ! mysqld_status check_dead nowarn; then
/etc/init.d/mysql: set +e
/etc/init.d/mysql: shutdown_out=`$MYADMIN shutdown 2>&1`; r=$?
/etc/init.d/mysql: set -e
/etc/init.d/mysql: if [ "$r" -ne 0 ]; then
/etc/init.d/mysql: log_end_msg 1
/etc/init.d/mysql: [ "$VERBOSE" != "no" ] && log_failure_msg "Error: $shutdown_out"
/etc/init.d/mysql: log_daemon_msg "Killing MySQL database server by signal" "mysqld"
/etc/init.d/mysql: killall -15 mysqld
/etc/init.d/mysql: server_down=
/etc/init.d/mysql: for i in 1 2 3 4 5 6 7 8 9 10; do
/etc/init.d/mysql: sleep 1
/etc/init.d/mysql: if mysqld_status check_dead nowarn; then server_down=1; break; fi
/etc/init.d/mysql: done
/etc/init.d/mysql: if test -z "$server_down"; then killall -9 mysqld; fi
/etc/init.d/mysql: fi
/etc/init.d/mysql: fi
/etc/init.d/mysql: if ! mysqld_status check_dead warn; then
/etc/init.d/mysql: log_end_msg 1
/etc/init.d/mysql: log_failure_msg "Please stop MySQL manually and read /usr/share/doc/mysql-server-5.5/README.Debian.gz!"
/etc/init.d/mysql: exit -1
/etc/init.d/mysql: else
/etc/init.d/mysql: log_end_msg 0
/etc/init.d/mysql: fi
/etc/init.d/mysql: ;;
/etc/init.d/mysql: 'restart')
/etc/init.d/mysql: set +e; $SELF stop; set -e
/etc/init.d/mysql: $SELF start
/etc/init.d/mysql: ;;
/etc/init.d/mysql: 'reload'|'force-reload')
/etc/init.d/mysql: log_daemon_msg "Reloading MySQL database server" "mysqld"
/etc/init.d/mysql: $MYADMIN reload
/etc/init.d/mysql: log_end_msg 0
/etc/init.d/mysql: ;;
/etc/init.d/mysql: 'status')
/etc/init.d/mysql: if mysqld_status check_alive nowarn; then
/etc/init.d/mysql: log_action_msg "$($MYADMIN version)"
/etc/init.d/mysql: else
/etc/init.d/mysql: log_action_msg "MySQL is stopped."
/etc/init.d/mysql: exit 3
/etc/init.d/mysql: fi
/etc/init.d/mysql: ;;
/etc/init.d/mysql: *)
/etc/init.d/mysql: echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
/etc/init.d/mysql: exit 1
/etc/init.d/mysql: ;;
/etc/init.d/mysql:esac
/etc/init/mysql.conf:# MySQL Service
/etc/init/mysql.conf:description "MySQL Server"
/etc/init/mysql.conf:author "Mario Limonciello <superm1@ubuntu.com>"
/etc/init/mysql.conf:start on runlevel [2345]
/etc/init/mysql.conf:stop on starting rc RUNLEVEL=[016]
/etc/init/mysql.conf:respawn
/etc/init/mysql.conf:respawn limit 2 5
/etc/init/mysql.conf:env HOME=/etc/mysql
/etc/init/mysql.conf:umask 007
/etc/init/mysql.conf:# The default of 5 seconds is too low for mysql which needs to flush buffers
/etc/init/mysql.conf:kill timeout 300
/etc/init/mysql.conf:pre-start script
/etc/init/mysql.conf: ## Fetch a particular option from mysql's invocation.
/etc/init/mysql.conf: # Usage: void mysqld_get_param option
/etc/init/mysql.conf: mysqld_get_param() {
/etc/init/mysql.conf: /usr/sbin/mysqld --print-defaults \
/etc/init/mysql.conf: | tr " " "\n" \
/etc/init/mysql.conf: | grep -- "--$1" \
/etc/init/mysql.conf: | tail -n 1 \
/etc/init/mysql.conf: | cut -d= -f2
/etc/init/mysql.conf: }
/etc/init/mysql.conf: # priority can be overriden and "-s" adds output to stderr
/etc/init/mysql.conf: ERR_LOGGER="logger -p daemon.err -t /etc/init/mysql.conf -i"
/etc/init/mysql.conf: #Sanity checks
/etc/init/mysql.conf: [ -r $HOME/my.cnf ]
/etc/init/mysql.conf: [ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
/etc/init/mysql.conf: /lib/init/apparmor-profile-load usr.sbin.mysqld
/etc/init/mysql.conf: # check for diskspace shortage
/etc/init/mysql.conf: datadir=`mysqld_get_param datadir`
/etc/init/mysql.conf: BLOCKSIZE=`LC_ALL=C df --portability $datadir/. | tail -n 1 | awk '{print $4}'`
/etc/init/mysql.conf: if [ $BLOCKSIZE -le 4096 ] ; then
/etc/init/mysql.conf: echo "$0: ERROR: The partition with $datadir is too full!" >&2
/etc/init/mysql.conf: echo "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER
/etc/init/mysql.conf: exit 1
/etc/init/mysql.conf: fi
/etc/init/mysql.conf:end script
/etc/init/mysql.conf:exec /usr/sbin/mysqld
/etc/init/mysql.conf:post-start script
/etc/init/mysql.conf: for i in `seq 1 30` ; do
/etc/init/mysql.conf: /usr/bin/mysqladmin --defaults-file="${HOME}"/debian.cnf ping && {
/etc/init/mysql.conf: exec "${HOME}"/debian-start
/etc/init/mysql.conf: # should not reach this line
/etc/init/mysql.conf: exit 2
/etc/init/mysql.conf: }
/etc/init/mysql.conf: statusnow=`status`
/etc/init/mysql.conf: if echo $statusnow | grep -q 'stop/' ; then
/etc/init/mysql.conf: exit 0
/etc/init/mysql.conf: elif echo $statusnow | grep -q 'respawn/' ; then
/etc/init/mysql.conf: exit 1
/etc/init/mysql.conf: fi
/etc/init/mysql.conf: sleep 1
/etc/init/mysql.conf: done
/etc/init/mysql.conf: exit 1
/etc/init/mysql.conf:end script
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment