0

RAM メモリに mysql インスタンスをセットアップすると、単体テストは数倍速く実行されますが、これは手動プロセスであるため、これを行うには時間がかかり、少数のサーバーでこれを行う必要があります。新しい mysql インスタンスは、空いている場合はポート 3307 で実行する必要があります。空いている場合はエラーを返します。

したがって、最初に必要なのは、一部のサービスが既にこのポートでリッスンしているかどうかを確認することです。このためのコードを追加しましたが、一部のサーバーでは、3307 ポートで実行されるプロセスが表示されません。このスクリプトを改善するために助けが必要です。シェルプログラミングの経験はあまりありません。

#!/bin/bash

STAT=`netstat -na | grep 3308 | awk '{print $6}'`
if [ "$STAT" = "LISTEN" ];
then
    echo "There is already process that listen on port 3307"
fi

# Create ramdisk
mkdir -p /mnt/ramdisk
mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk
chown mysql:mysql /mnt/ramdisk

port=3307

distribution=$(lsb_release -i | cut -f2)


if [ $distribution == 'Debian' ]
then
    mkdir /var/lib/mysql2
    chown -R mysql.mysql /var/lib/mysql2/
    mkdir /var/log/mysql2
    chown -R mysql.mysql /var/log/mysql2
    cp -R /etc/mysql/ /etc/mysql2
    cd /etc/mysql2/
    sed -i "s/3306/$port/g" my.cnf
    sed -i "s/mysqld.sock/mysqld2.sock/g" my.cnf
    sed -i "s/mysqld.pid/mysqld2.pid/g" my.cnf
    sed -i "s/var\/lib\/mysql/var\/lib\/mysql2/g" my.cnf
    sed -i "s/var\/log\/mysql/var\/log\/mysql2/g" my.cnf
    mysql_install_db --user=mysql --datadir=/mnt/ramdisk
    mysqld_safe --defaults-file=/etc/mysql2/my.cnf &
elif [ $distribution == 'CentOS' ]
then
    cp /etc/my.cnf /etc/my2.cnf
    cd /etc
    sed -i "s/3306/$port/g" my2.cnf
    sed -i "s/mysqld.sock/mysqld2.sock/g" my2.cnf
    sed -i "s/mysqld.pid/mysqld2.pid/g" my2.cnf
    sed -i "s/var\/lib\/mysql/var\/lib\/mysql2/g" my2.cnf
    sed -i "s/var\/log\/mysql/var\/log\/mysql2/g" my2.cnf
    mysql_install_db --user=mysql --datadir=/mnt/ramdisk
    mysqld_safe --defaults-file=/etc/my2.cnf &
else
    exit 13
fi
4

1 に答える 1

1

テストで3308を使用したという事実を無視して、ポートで何かがリッスンしているかどうかを確認するために、代わりにnetcatを使用することをお勧めします。netcatは単に接続を試みます。

if nc -z localhost "$port"
then
  echo "Port $port is in use"
  exit 1
fi

同様にlsof -i TCP:"$port" -s TCP:LISTEN、リスニングコマンドがある場合はそれを出力するというおそらく望ましい副作用がある場合に使用できます。netstatの解析に対するnc/lsofの利点は、誤って解析できないことです(たとえば、アプリがUDPポート13307をリッスンした場合はケースが壊れます)。

set -e2行目として追加することをお勧めします。これにより、コマンドの1つが失敗した場合(ファイルやアクセス許可がないなどの理由で)、次のコマンドを無意味に続行して何かを台無しにするのではなく、bashが中止されます。

1つのsedコマンドで複数の式を使用し、sに異なる区切り文字を使用して、過度のエスケープを回避することもできます。

sed -i -e 's/mysqld.pid/mysqld2.pid/g' \
       -e 's:/var/lib/mysql:/var/lib/mysql2/:g' \
       file

一般的にsed -i '1i# Autogenerated file, do not edit' my.cnf、最初の行にコメントを追加して、他のユーザーがコメントを変更したり、変更内容を上書きしたりしないようにすることもできます。

于 2012-12-15T20:17:25.423 に答える