Bash wait for service to start

bashservice

I'm having trouble with the first part of the bash script, I need to wait for server mysql to start before executing mysqadmin commands… I cannot reliable get it to work!

#!/bin/bash

if [[ ! -f /var/lib/mysql/status.secured ]]; then
  echo "MariaDB -> secure"
  #
  /usr/sbin/service mysql start
  while "$(mysql -u root -e "select 1")" -ne 1; do
    sleep 1
  done
  #
  mysqladmin -u root password "$MARIA_ROOT_PASSWORD"
  mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "UPDATE mysql.user SET Password=PASSWORD('$MARIA_ROOT_PASSWORD') WHERE User='root'"
  mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')"
  mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "DELETE FROM mysql.user WHERE User=''"
  mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'"
  mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "FLUSH PRIVILEGES"
  touch /var/lib/mysql/status.secured
  #
  /usr/sbin/service mysql stop
  while [[ "$(/usr/sbin/service mysql status)" != " * MariaDB is stopped." ]]; do
    sleep 1
  done
  echo "MariaDB -> secured"
fi

It is ubuntu based docker container, phusion/baseimage

Best Answer

I think this will work:

#!/bin/bash

if [[ ! -f /var/lib/mysql/status.secured ]]; then
  echo "MariaDB -> secure"
  #
  /usr/sbin/service mysql start
  #give up if not started in 2min
  if mysqladmin --wait=120 -u root password "$MARIA_ROOT_PASSWORD"; then
    mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "UPDATE mysql.user SET Password=PASSWORD('$MARIA_ROOT_PASSWORD') WHERE User='root'"
    mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')"
    mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "DELETE FROM mysql.user WHERE User=''"
    mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'"
    mysql -u root -p"$MARIA_ROOT_PASSWORD" -e "FLUSH PRIVILEGES"
    touch /var/lib/mysql/status.secured
    /usr/sbin/service mysql stop
    while [[ "$(/usr/sbin/service mysql status)" != " * MariaDB is stopped." ]]; do
      sleep 1
    done
    echo "MariaDB -> secured"
  else
    echo Gave up waiting for mysqld to respond
    /usr/sbin/service mysql stop
  fi

fi