[과제] Redis 설치 자동화 셸 스크립트(binary) 고도화

강세준·2023년 2월 8일
0

피드백


1. Make / Make install 차이점

Make Make install Configure 차이점

2. bash 셸 초기화 파일 순서

bash 셸 초기화 파일 순서 정리

3. 삭제 여부 확인하고 Redis 삭제

# redis binary 설치 확인 및 삭제 로직
redis_count=`find ${user_path}/redis* | wc -l`
if [ ${redis_count} -gt 0 ]; then
        # redis 삭제 여부 확인
        read -p "설치된 Redis를 삭제하시겠습니까?(y, n) : " delete_flag
        if [ ${delete_flag} == "y" ]; then
                echo `rm -rf ${user_path}/redis*`
                echo "redis 설치가 확인되어 삭제합니다."
        else
                echo "redis를 삭제하지 않고 프로그램을 종료합니다."
                exit 2
        fi
fi

4. 값을 넣지 않으면 Default값으로 들어가 설치되게 끔 수정

#redis 버전 인자를 입력했는지 확인 및 링크 정보 확인
if [ -z ${redis_version} ]; then
        redis_version="7.0.8"
        echo "버전 정보를 입력하지 않았음으로 최신 버전으로 설치를 진행합니다."
fi

5. 설치 시 실행되고 있는 redis-server가 존재하는 경우 종료하고 재설치

#실행중인 redis process kill
running_redis_process=`ps -ef | grep redis | grep -v color=auto | awk '{print $2}'`
if [ -z ${running_redis_process} ]; then
	echo "실행 중인 레디스 프로세스가 없습니다."
else
	echo `kill -9 ${running_redis_process}`
	echo "${running_redis_process}를 kill합니다."
fi

6. /etc/sysctl.conf에 리다이렉션으로 쓸 때 허가 거부 에러

셸에서 /etc/sysctl.conf에 redirection을 하면 허가 거부 에러가 난다.
sudo를 redirection시 사용해도 자식 process를 생성하여 작업을 수행하게 되고 sudo는 parent process에서 적용되기 때문에 /etc/sysctl.conf에 redirection을 통해 쓸수없다
이는 /etc/security/limits.conf도 마찬가지이다.

따라서 sed명령어를 통해 파일의 끝에 line을 추가하는 식으로 파라미터를 넣어준다.

if [ ${redis_conf_count} -ge 1 ]; then
	echo "이미 redis.conf의 alias가 지정되었습니다."
else
	echo `sed -i '$ a alias redis.conf='${user_path}'/redis/redis.conf' ${user_path}/.bashrc`
fi

# redis 설정 에러 해결
# maxclients

# echo `ulimit -n 50000`

# 영구적 등록 (루트 권한이 아닐 경우에는 ulimit 명령어도 실행되지 않음)
maxclients_count=`grep centos /etc/security/limits.conf | wc -l`
if [ ${maxclients_count} -gt 0 ]; then
	echo "이미 centos계정의 maxclients값이 설정되어 있습니다."
else
	echo `sudo sed -i '$ a centos	 soft	nofile		50000' /etc/security/limits.conf`
	echo `sudo sed -i '$ a centos	 hard	nofile		50000' /etc/security/limits.conf`
fi

# TCP backlog
echo `sudo sysctl -w net.core.somaxconn=1024`

# 영구적 등록
somaxconn_count=`grep somaxconn /etc/sysctl.conf | wc -l`
if [ ${somaxconn_count} -gt 0 ]; then
	echo "이미 somaxconn값이 설정되어 있습니다."
else
	echo `sudo sed -i '$ a net.core.somaxconn = 1024' /etc/sysctl.conf`
fi

# Memory overcommit
echo `sudo sysctl -w vm.overcommit_memory=1`

# 영구적 등록
overcommit_count=`grep overcommit /etc/sysctl.conf | wc -l`
if [ ${overcommit_count} -gt 0 ]; then
	echo "이미 overcommit값이 설정되어 있습니다."
else
	echo `sudo sed -i '$ a vm.overcommit_memory = 1' /etc/sysctl.conf`
fi

코드


#!/usr/bin/env bash

redis_version=${1}
user_path="/home/centos"

#실행중인 redis process kill
running_redis_process=`ps -ef | grep redis | grep -v color=auto | awk '{print $2}'`
if [ -z ${running_redis_process} ]; then
	echo "실행 중인 레디스 프로세스가 없습니다."
else
	echo `kill -9 ${running_redis_process}`
	echo "${running_redis_process}를 kill합니다."
fi

#redis 버전 인자를 입력했는지 확인 및 링크 정보 확인
if [ -z ${redis_version} ]; then
        redis_version="7.0.8"
        echo "버전 정보를 입력하지 않았음으로 최신 버전으로 설치를 진행합니다."
fi

redis_folderName="redis-${redis_version}"

redis_connection=`wget --timeout=1 --tries=1 --spider http://download.redis.io/releases/${redis_folderName}.tar.gz | grep 'broken link' | wc -l`
if [ redis_connection -ge 1 ]; then
        echo "잘못된 링크입니다. 프로그램을 종료합니다."
        exit 1
fi


# redis binary 설치 확인 및 삭제 로직
redis_count=`find ${user_path}/redis* | wc -l`
if [ ${redis_count} -gt 0 ]; then
        # redis 삭제 여부 확인
        read -p "설치된 Redis를 삭제하시겠습니까?(y, n) : " delete_flag
        if [ ${delete_flag} == "y" ]; then
                echo `rm -rf ${user_path}/redis*`
                echo "redis 설치가 확인되어 삭제합니다."
        else
                echo "redis를 삭제하지 않고 프로그램을 종료합니다."
                exit 2
        fi
fi

# 인자를 주어야 실행되는 로직
# redis 설치
echo `wget http://download.redis.io/releases/${redis_folderName}.tar.gz`

# 필수 라이브러리 설치
echo `sudo yum install -y python3`
echo `sudo yum install -y gcc`


# redis 압축해제
echo `mv ${redis_folderName}.tar.gz ${user_path}`
echo `tar -xvf ${user_path}/${redis_folderName}.tar.gz -C ${user_path}`
echo `ln -s ${user_path}/${redis_folderName} ${user_path}/redis`

# 권한 변경
echo `sudo chown -R centos:centos ${user_path}/${redis_folderName}`
echo `sudo chown -h centos:centos ${user_path}/redis`

# 파일 이동

# make 소스파일 컴파일
echo `cd ${user_path}/redis/deps && sudo make -j 3 hdr_histogram hiredis jemalloc linenoise lua`
echo `cd ${user_path}/redis && sudo make install `

# 컴파일 내용 권한 변경
echo `sudo chown -R centos:centos ${user_path}/${redis_folderName}`

# redis 커맨드 환경변수로 등록
redis_env_count=`cat ${user_path}/.bashrc | grep 'redis' | wc -l`

if [ ${redis_env_count} -gt 0 ]; then
#!/usr/bin/env bash
	echo "이미 redis의  bashrc 환경변수가 지정되었습니다."
else
#!/usr/bin/env bash

redis_version=${1}
#실행중인 redis process kill
if [ -z ${running_redis_process} ]; then
        echo "실행 중인 레디스 프로세스가 없습니다."
else
        echo `kill -9 ${running_redis_process}`
        echo "${running_redis_process}를 kill합니다."
fi

#redis 버전 인자를 입력했는지 확인 및 링크 정보 확인
        echo "버전 정보를 입력하지 않았음으로 최신 버전으로 설치를 진행합니다."
fi

redis_folderName="redis-${redis_version}"

if [ redis_connection -ge 1 ]; then
        echo "잘못된 링크입니다. 프로그램을 종료합니다."
        exit 1
fi


if [ ${redis_count} -gt 0 ]; then
        # redis 삭제 여부 확인
        read -p "설치된 Redis를 삭제하시겠습니까?(y, n) : " delete_flag
        if [ ${delete_flag} == "y" ]; then
                echo `rm -rf ${user_path}/redis*`
                echo "redis 설치가 확인되어 삭제합니다."
        else
                echo "redis를 삭제하지 않고 프로그램을 종료합니다."
                exit 2
        fi
fi

# 필수 라이브러리 설치
echo `sudo yum install -y python3`
echo `sudo yum install -y gcc`


# redis 압축해제
echo `mv ${redis_folderName}.tar.gz ${user_path}`
echo `tar -xvf ${user_path}/${redis_folderName}.tar.gz -C ${user_path}`
echo `ln -s ${user_path}/${redis_folderName} ${user_path}/redis`

# 권한 변경
echo `sudo chown -R centos:centos ${user_path}/${redis_folderName}`
echo `sudo chown -h centos:centos ${user_path}/redis`

# 파일 이동

# make 소스파일 컴파일
echo `cd ${user_path}/redis && sudo make install `

# 컴파일 내용 권한 변경
echo `sudo chown -R centos:centos ${user_path}/${redis_folderName}`

	echo `echo "export PATH="\\$"PATH:"${user_path}"/redis/src/" >> ${user_path}/.bashrc`
fi

# 환경변수는 바로 등록이 안되므로 alias 사용
echo `alias redis-cli="${user_path}"/redis/src/redis-cli`
echo `alias redis-server="${user_path}"/redis/src/redis-server`
echo `alias redis.conf="${user_path}"/redis/redis.conf`

# redis.conf alias 영구 등록
redis_conf_count=`cat ${user_path}/.bashrc | grep 'redis.conf' | wc -l`

if [ ${redis_conf_count} -ge 1 ]; then
	echo "이미 redis.conf의 alias가 지정되었습니다."
else
	echo `sed -i '$ a alias redis.conf='${user_path}'/redis/redis.conf' ${user_path}/.bashrc`
fi

# redis 설정 에러 해결
# maxclients

# echo `ulimit -n 50000`

# 영구적 등록 (루트 권한이 아닐 경우에는 ulimit 명령어도 실행되지 않음)
maxclients_count=`grep centos /etc/security/limits.conf | wc -l`
if [ ${maxclients_count} -gt 0 ]; then
	echo "이미 centos계정의 maxclients값이 설정되어 있습니다."
else
	echo `sudo sed -i '$ a centos	 soft	nofile		50000' /etc/security/limits.conf`
	echo `sudo sed -i '$ a centos	 hard	nofile		50000' /etc/security/limits.conf`
fi

# TCP backlog
echo `sudo sysctl -w net.core.somaxconn=1024`

# 영구적 등록
somaxconn_count=`grep somaxconn /etc/sysctl.conf | wc -l`
if [ ${somaxconn_count} -gt 0 ]; then
	echo "이미 somaxconn값이 설정되어 있습니다."
else
	echo `sudo sed -i '$ a net.core.somaxconn = 1024' /etc/sysctl.conf`
fi

# Memory overcommit
echo `sudo sysctl -w vm.overcommit_memory=1`

# 영구적 등록
overcommit_count=`grep overcommit /etc/sysctl.conf | wc -l`
if [ ${overcommit_count} -gt 0 ]; then
	echo "이미 overcommit값이 설정되어 있습니다."
else
	echo `sudo sed -i '$ a vm.overcommit_memory = 1' /etc/sysctl.conf`
fi

결과


profile
데이터를 탐구하는 개발자

0개의 댓글