Ubuntu와 같은 λ¦¬λˆ…μŠ€ λ°°ν¬νŒμ€ APT 그리고 CentOS와 같은 λ¦¬λˆ…μŠ€ λ°°ν¬νŒμ€ YUM μ΄λ‚˜ DNFλ₯Ό μ‚¬μš©ν•˜μ—¬ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λ₯Ό ν†΅ν•΄μ„œ μ„€μΉ˜ν•˜λŠ” 경우 System and Service Managerλ₯Ό 톡해 μ„œλΉ„μŠ€ λ“±λ‘μœΌλ‘œ μ‰½κ²Œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜κ³  μ’…λ£Œν•  수 있게 μ§€μ›ν•©λ‹ˆλ‹€.

sudo systemctl enable --now docker 

κ·ΈλŸ¬λ‚˜, 가끔은 νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €μ—μ„œ 기본적으둜 λ“±λ‘λœ λ¦¬νŒŒμ§€ν† λ¦¬(Repository)μ—μ„œ λ‹€μ–‘ν•œ 버전을 μ§€μ›ν•˜μ§€ μ•ŠμŒμœΌλ‘œ 인해 μ—˜λΌμŠ€ν‹±μ„œμΉ˜ 7.12.0 λ°”μ΄λ„ˆλ¦¬ λ‹€μš΄λ‘œλ“œλ₯Ό 톡해 운영체제 μ•„ν‚€ν…μ²˜ λ‹¨μœ„λ‘œ λΉŒλ“œλœ μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 직접 Systemd에 μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€μ–΄μ„œ λ“±λ‘ν•˜κ±°λ‚˜ ν”„λ‘œμ„ΈμŠ€ μ‹œμž‘ λ˜λŠ” μ’…λ£Œλ₯Ό μœ„ν•œ 슀크립트λ₯Ό λ§Œλ“€μ–΄μ•Όν•©λ‹ˆλ‹€.

μ„œλΉ„μŠ€ 등둝 이외에도 도컀 μ»¨ν…Œμ΄λ„ˆλ₯Ό 기반으둜 κ°„λ‹¨ν•˜κ²Œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μžλ™μœΌλ‘œ μž¬μ‹œμž‘ν•  수 있게 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” 일본 고객 ν™˜κ²½μ˜ κ²½μš°μ—λŠ” μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ˜ 도쿄(ap-northeast-1) λ¦¬μ „μ˜ λŒ€κ·œλͺ¨ μž₯애와 μž¦μ€ μ§€μ§„μœΌλ‘œ μΈν•œ μ •μ „ μ‚¬νƒœλ“±μ„ κ³ λ €ν•΄μ„œ μ‹œμŠ€ν…œμ΄ μ•ˆμ •μ μΈ μƒνƒœλ‘œ μžλ™μœΌλ‘œ λ³΅κ΅¬λ˜λ„λ‘ ν”„λ‘œμ„ΈμŠ€λ₯Ό μž¬μ‹œμž‘ν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€. 이와 같은 이유둜 고객 ν™˜κ²½μ—μ„œ μ‚¬μš©μ€‘μΈ μ•Œλ§ˆλ¦¬λˆ…μŠ€(AlmaLinux)λ₯Ό κΈ°μ€€μœΌλ‘œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜κ³  μ’…λ£Œν•˜λŠ” 슀크립트λ₯Ό μž‘μ„±ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ‹€ν–‰ 슀크립트

#!/bin/bash
ES_USER="ec2-user"
ES_HOME="/home/$ES_USER/elasticsearch-7.3.2"
PID=`ps aux | grep $ES_HOME | pidof java`
ps aux | grep $ES_HOME | pidof java > /dev/null
RESULT=$?

if [ 0 = $RESULT ]; then
    echo "[`date --rfc-3339=seconds`] [WARN] Already running with pid($PID)."
else
    echo "[`date --rfc-3339=seconds`] [INFO] Starting elasticsearch..."
    ${ES_HOME}/bin/elasticsearch -d -p ${ES_HOME}/elasticsearch.pid
fi

ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•  λ•Œμ—λŠ” μ˜ˆμƒλ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 이미 싀행쀑인지λ₯Ό ps λͺ…λ Ήμ–΄λ₯Ό 톡해 ν”„λ‘œμ„ΈμŠ€ μƒνƒœλ₯Ό μ²΄ν¬ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€ 아이디가 μ‘΄μž¬ν•˜λŠ”μ§€μ˜ 결과에 따라 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•΄μ•Όν•˜λŠ”μ§€ νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μœ„μ™€ 같이 μ‹€ν–‰ 슀크립트λ₯Ό μž‘μ„±ν•˜λŠ” 경우 크둠탭을 ν†΅ν•΄μ„œ μ„œλ²„ λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ˜ˆμƒν•˜μ§€ λͺ»ν•˜λŠ” 이유둜 μ’…λ£Œλ˜λ”λΌλ„ λ‹€μ‹œ 싀행될 수 μžˆλ„λ‘ μ μš©ν•  수 있게 λ©λ‹ˆλ‹€.

μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ’…λ£Œ 슀크립트

#!/bin/bash
ES_USER="ec2-user"
ES_HOME="/home/$ES_USER/elasticsearch-7.3.2"
PID=`ps aux | grep $ES_HOME | pidof java`
ps aux | grep $ES_HOME | pidof java > /dev/null
RESULT=$?

if [ 0 = $RESULT ]; then
    echo "[`date --rfc-3339=seconds`] [INFO] Stopping elasticsearch..."
    kill -15 $PID

    sleep 3

    ps aux | grep $ES_HOME | pidof java > /dev/null
    RESULT=$?

    if [ 0 = $RESULT ]; then
        echo "[`date --rfc-3339=seconds`] [ERROR] Cannot stop elasticsearch"
    else
        echo "[`date --rfc-3339=seconds`] [INFO] Stopped elasticsearch."
    fi
else
    echo "[`date --rfc-3339=seconds`] [WARN] Elasticsearch not running."
fi

ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£ŒλŠ” λ‹¨μˆœν•˜κ²Œ kill λͺ…령어와 ν•¨κ»˜ ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ 아이디λ₯Ό μ§€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, SIGTERM μ‹œκ·Έλ„μ„ 보내도 ν”„λ‘œμ„ΈμŠ€κ°€ μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•Šμ„ 수 μžˆμœΌλ―€λ‘œ kill λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜κ³ λ‚˜μ„œ μž μ‹œ λŒ€κΈ°ν•œ λ‹€μŒ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ μƒνƒœλ₯Ό λ‹€μ‹œ ν•œλ²ˆ μ²΄ν¬ν•˜μ—¬ μ œλŒ€λ‘œ μ’…λ£Œλ˜μ—ˆλŠ”μ§€λ₯Ό μ²΄ν¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μœ„ 슀크립트λ₯Ό 더 λ³΄μ™„ν•œλ‹€λ©΄ 일정 μ‹œκ°„μ„ λŒ€κΈ°ν•˜λŠ” 것과 ν•¨κ»˜ N번 더 ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œλ₯Ό μˆ˜ν–‰ν•˜λ„λ‘ λ°˜λ³΅λ¬Έμ„ μ μš©ν•΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ €λŠ” ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ 슀크립트λ₯Ό μ‹€ν–‰ν•˜λŠ” 것은 μ‚¬μš©μžμ— μ˜ν•œ λͺ…μ‹œμ μΈ ν–‰μœ„λΌκ³  μƒκ°ν•˜μ—¬ ν•œλ²ˆ 만 μˆ˜ν–‰ν•˜κ³  결과에 따라 확인할 수 μžˆλ„λ‘ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

슀크립트 μ£Όμ˜μ‚¬ν•­

μ—˜λΌμŠ€ν‹±μ„œμΉ˜λŠ” 자체적으둜 싀행쀑인 ν”„λ‘œμ„ΈμŠ€ 아이디λ₯Ό 파일둜 μƒμ„±ν•˜λŠ” νŒŒλΌλ―Έν„° μ˜΅μ…˜μ„ μ œκ³΅ν•˜μ§€λ§Œ 일뢀 ν”„λ‘œμ„ΈμŠ€λŠ” μ§€μ›ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ nohup λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜κ³ λ‚˜μ„œ echo $! λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‹€ν–‰λœ ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ 아이디λ₯Ό κ°€μ Έμ™€μ„œ 파일둜 κΈ°λ‘ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€ 아이디가 μ €μž₯된 νŒŒμΌμ„ ν†΅ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜κ²Œ 되면 ν”„λ‘œμ„ΈμŠ€κ°€ μ€‘λ³΅μœΌλ‘œ 싀행될 수 μžˆλŠ” 취약점을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, μœ„ μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” pidof λͺ…λ Ήμ–΄λ‘œ μ»€λ§¨λ“œ 기반으둜 ν”„λ‘œμ„ΈμŠ€ 아이디λ₯Ό κ°€μ Έμ™”μ§€λ§Œ μ»€λ§¨λ“œ μ΄λ¦„λ§ŒμœΌλ‘œλŠ” μ œλŒ€λ‘œ ꡬ뢄할 수 μ—†μ–΄μ„œ μ•„λž˜μ™€ 같이 grep κ³Ό awk λͺ…λ Ήμ–΄λ₯Ό 톡해 ν”„λ‘œμ„ΈμŠ€ 아이디λ₯Ό μΆ”μΆœν•΄μ•Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 단일 ν”„λ‘œμ„ΈμŠ€λΌλ©΄ pidof λͺ…λ Ήμ–΄κ°€ κ°„λ‹¨ν•˜μ§€λ§Œ λ‹€μˆ˜μ˜ ν”„λ‘œμ„ΈμŠ€λ‘œ μ‹€ν–‰ν•˜λŠ” μ‹œμŠ€ν…œμ΄λΌλ©΄ μ£Όμ˜ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€.

# νŠΉμ • ν”„λ‘œμ„ΈμŠ€ μ°ΎκΈ°
ubuntu@ubuntu:~$ ps aux | grep '/home/ubuntu/q/l64/q -p 5000'
ubuntu     60379  0.0  0.2 298068  5584 ?        Sl   Jan30   0:04 /home/ubuntu/q/l64/q -p 5000
ubuntu     76497  0.0  0.0   6440   720 pts/0    S+   13:51   0:00 grep --color=auto /home/ubuntu/q/l64/q -p 5000

# Grep λͺ…λ Ήμ–΄λŠ” μ œμ™Έ
ubuntu@ubuntu:~$ ps aux | grep '/home/ubuntu/q/l64/q -p 5000' | grep -v grep
ubuntu     60379  0.0  0.2 298068  5584 ?        Sl   Jan30   0:04 /home/ubuntu/q/l64/q -p 5000

# 2번째 ν”„λ‘œμ„ΈμŠ€ 아이디 μΆ”μΆœ
ubuntu@ubuntu:~$ ps -ef | grep '/home/ubuntu/q/l64/q -p 5000' | grep -v grep | awk '{print $2}'
60379

크둠탭을 μ‚¬μš©ν•΄μ„œ μžλ™μœΌλ‘œ μž¬μ‹œμž‘ν•˜λ„λ‘ 슀크립트λ₯Ό 주기적으둜 μ‹€ν–‰ν• λ•Œμ—λ„ λ¦¬λˆ…μŠ€ 배포판의 κΈ°λ³Έ μ‰˜μ˜ 차이둜 인해 μ‚¬μš©μžμ˜ ν™˜κ²½λ³€μˆ˜κ°€ μ œλŒ€λ‘œ λ“±λ‘λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μš°λΆ„νˆ¬μ˜ κ²½μš°μ—λŠ” μ•„λž˜μ™€ 같이 크둠탭을 μ‚¬μš©ν•  λ•Œ bashλ₯Ό μ§€μ •ν•˜λŠ”κ²Œ μ’‹μŠ΅λ‹ˆλ‹€.

crontab -e
SHELL=/bin/bash
@reboot /home/ubuntu/start.sh >> /home/ubuntu/start.log

μ°Έκ³