๐น ์ํคํ
์ฒ ๊ฐ์ ๋ฐ ๋งน์ ์ง๋จ
๐ธ ๋ฆฌ๋
์ค ํด๋ผ์ฐ๋ ํ๊ฒฝ(GCP, AWS ๋ฑ)์์ ํํธ ๋ด์ 24์๊ฐ ๋ฐฉ์นํ์ผ๋ก ๊ตฌ๋ํ๊ธฐ ์ํด์๋ OS ์ฝ์ด์ ์ข
์๋๋ systemd ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค(Zombie Bot) ๊ตฌ์ถ์ด ํ์์ ์
๋๋ค.
๐ธ ํ
๋ ๊ทธ๋จ ์งํ์์์ /update ์ปค๋งจ๋ ๊ฒฉ๋ฐ ์, ๋ด์ด ๊นํ๋ธ ์ต์ ์ฝ๋๋ฅผ ํ๋ง(Pull)ํ๊ณ OS ๋ฐํ์์์ ์ค์ค๋ก ์ฌ์์(Self-Restart)ํ๋ ค๋ฉด ์์คํ
์ ๋ฑ๋ก๋ ๋ฐ๋ชฌ์ ๊ณ ์ ์ด๋ฆ(daemon_name)์ ๋ด์ด ์ ํํ ์ธ์ํด์ผ ํฉ๋๋ค.
๐ธ ํ์ง๋ง ๋ฆฌ๋
์ค์ systemd ์๋น์ค๋ ์ฌ์ฉ์์ ๋ํํ ์(~/.bashrc)๊ณผ ์๋ฒฝํ ๊ฒฉ๋ฆฌ๋ ์๋๋ฐ์ค์์ ๊ตฌ๋๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ์ ํ๊ฒฝ๋ณ์ ์ฃผ์
๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํ์ด์ฌ์ด ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํ๊ณ ๋ณ์๊ฐ ์ฆ๋ฐํ์ฌ ๋ด ์ฌ๊ฐ๋์ ์คํจํ๋ ์น๋ช
์ ๋งน์ (Isolation Leak)์ด ๋ฐ์ํฉ๋๋ค.
๐ธ ์ด๋ฅผ ์์ฒ ์ฐจ๋จํ๊ธฐ ์ํด, ๋ฐ๋ชฌ์ ๊ตฌ๋ํ๋ .service ํ์ผ ๋ด๋ถ์ [Service] ์ง์ธต์ Environment ์์ฑ์ ์ง์ ํ๋์ฝ๋ฉํ์ฌ ํฉํธ๋ฅผ ๊ฐ์ธํ๋ ๋ฌด๊ฒฐ์ ์์ ๊ฐ์ด๋๋ฅผ ํ๋ฌํฉ๋๋ค.
๐น ์์คํ
๋ฐ๋ชฌ(Service) ์์์ฑ ์ฃผ์
์์ ๋จ๊ณ
๐ธ ํฐ๋ฏธ๋ ์๋ํฐ(nano ๋ฑ)๋ฅผ ํธ์ถํ์ฌ ๋ด์ ์์คํ
๋ฐ๋ชฌ ํ์ผ์ ์ง์ ๊ฐ๋ณต(Open)ํฉ๋๋ค. ์๋ ๋ช
๋ น์ด์ [์ฌ์ฉ์๋ด์ด๋ฆ]์ ๋ณธ์ธ์ด ์ค์ ํ ๋ฐ๋ชฌ ์ด๋ฆ์ผ๋ก ์นํํ์ญ์์ค.
sudo nano /etc/systemd/system/[์ฌ์ฉ์๋ด์ด๋ฆ].service
๐ธ ์๋ํฐ๊ฐ ์ด๋ฆฌ๋ฉด, ์๋์ ๋ฌด๊ฒฐ์ ์ํคํ
์ฒ ํ
์คํธ๋ฅผ ๋ณต์ฌํ์ฌ ํ์ผ ๋ด๋ถ์ ๋ฎ์ด์ฐ๊ธฐ ํ์ญ์์ค. (๋ฐ๋์ [์ฌ์ฉ์๊ณ์ ๋ช
]๊ณผ [์ฌ์ฉ์๋ด์ด๋ฆ]์ ๋ณธ์ธ์ ๋ฆฌ๋
์ค ํ๊ฒฝ์ ๋ง๊ฒ ํฉํธ ๊ต์ ํด์ผ ํฉ๋๋ค.)
[Unit]
Description=Trading Zombie Bot Daemon
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/home/[์ฌ์ฉ์๊ณ์ ๋ช
]
Environment="TZ=Asia/Seoul"
Environment="daemon_name=[์ฌ์ฉ์๋ด์ด๋ฆ]"
ExecStart=/usr/bin/python3 /home/[์ฌ์ฉ์๊ณ์ ๋ช
]/main.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
๐ธ ์ฝ๋ ์ฃผ์
์ด ์๋ฃ๋์๋ค๋ฉด ํ์ผ์ ์ ์ฅํ๊ณ ์๋ํฐ๋ฅผ ํ์ถํฉ๋๋ค. (nano ์๋ํฐ ๊ธฐ์ค: Ctrl+O โ Enter โ Ctrl+X ์์๋ก ๊ฒฉ๋ฐ)
๐น ํ์ ๋ฌด๊ฒฐ์ฑ ํ
์คํธ ๋ฐ ๋ฐ๋ชฌ ์ฌ๊ฐ๋ ์ํ์ค
๐ธ OS ์ฝ์ด์ ๋ฐฉ๊ธ ๋ณ๊ฒฝ๋ ํฉํธ๋ฅผ ์๊ตฌ ๊ฐ์ธ์ํค๊ณ (fsync ํจ๊ณผ), ๋ฐ๋ชฌ์ ๋ค์ ๊นจ์ฐ๊ธฐ ์ํด ์๋ ๋ ๋ช
๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์์ ์ฌ๋ฆฌ์ญ์์ค.
sudo systemctl daemon-reload
sudo systemctl restart [์ฌ์ฉ์๋ด์ด๋ฆ]
๐ธ ์ ๋ฆด๋ก๋ ๋ฐ ์ฌ๊ฐ๋ ์ํ์ค๋ฅผ ์์ํ์ ๋ค, ํ
๋ ๊ทธ๋จ ๋ด ์งํ์์ ์ ์ํ์ฌ /update ์ปค๋งจ๋๋ฅผ ๊ฒฉ๋ฐํ์ญ์์ค.
๐ธ ๋ด์ด OS ํ๊ฒฝ๋ณ์(daemon_name)๋ฅผ ์ ์์ ์ผ๋ก ์ถ์ถํด๋ด์ด ์์คํ
๋ฐ๋ชฌ์ ์ฑ๊ณต์ ์ผ๋ก ์๊ฐ ์ฌ์์ํ๋์ง ํฉํธ ์ฒดํฌ๋ฅผ ์๋ฃํ๋ฉด, ์ด๋ ํ ๊ฐํนํ ํ๊ฒฝ์์๋ ์ฃฝ์ง ์๋ ๋ฐฉํ ์ข๋น ๋ด ์ํคํ
์ฒ ๊ตฌ์ถ์ด ์ต์ข
์๋ฃ๋ฉ๋๋ค. ๐
๐น ์ํคํ ์ฒ ๊ฐ์ ๋ฐ ๋งน์ ์ง๋จ
๐ธ ๋ฆฌ๋ ์ค ํด๋ผ์ฐ๋ ํ๊ฒฝ(GCP, AWS ๋ฑ)์์ ํํธ ๋ด์ 24์๊ฐ ๋ฐฉ์นํ์ผ๋ก ๊ตฌ๋ํ๊ธฐ ์ํด์๋ OS ์ฝ์ด์ ์ข ์๋๋ systemd ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค(Zombie Bot) ๊ตฌ์ถ์ด ํ์์ ์ ๋๋ค.
๐ธ ํ ๋ ๊ทธ๋จ ์งํ์์์ /update ์ปค๋งจ๋ ๊ฒฉ๋ฐ ์, ๋ด์ด ๊นํ๋ธ ์ต์ ์ฝ๋๋ฅผ ํ๋ง(Pull)ํ๊ณ OS ๋ฐํ์์์ ์ค์ค๋ก ์ฌ์์(Self-Restart)ํ๋ ค๋ฉด ์์คํ ์ ๋ฑ๋ก๋ ๋ฐ๋ชฌ์ ๊ณ ์ ์ด๋ฆ(daemon_name)์ ๋ด์ด ์ ํํ ์ธ์ํด์ผ ํฉ๋๋ค.
๐ธ ํ์ง๋ง ๋ฆฌ๋ ์ค์ systemd ์๋น์ค๋ ์ฌ์ฉ์์ ๋ํํ ์(~/.bashrc)๊ณผ ์๋ฒฝํ ๊ฒฉ๋ฆฌ๋ ์๋๋ฐ์ค์์ ๊ตฌ๋๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ์ ํ๊ฒฝ๋ณ์ ์ฃผ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํ์ด์ฌ์ด ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํ๊ณ ๋ณ์๊ฐ ์ฆ๋ฐํ์ฌ ๋ด ์ฌ๊ฐ๋์ ์คํจํ๋ ์น๋ช ์ ๋งน์ (Isolation Leak)์ด ๋ฐ์ํฉ๋๋ค.
๐ธ ์ด๋ฅผ ์์ฒ ์ฐจ๋จํ๊ธฐ ์ํด, ๋ฐ๋ชฌ์ ๊ตฌ๋ํ๋ .service ํ์ผ ๋ด๋ถ์ [Service] ์ง์ธต์ Environment ์์ฑ์ ์ง์ ํ๋์ฝ๋ฉํ์ฌ ํฉํธ๋ฅผ ๊ฐ์ธํ๋ ๋ฌด๊ฒฐ์ ์์ ๊ฐ์ด๋๋ฅผ ํ๋ฌํฉ๋๋ค.
๐น ์์คํ ๋ฐ๋ชฌ(Service) ์์์ฑ ์ฃผ์ ์์ ๋จ๊ณ
๐ธ ํฐ๋ฏธ๋ ์๋ํฐ(nano ๋ฑ)๋ฅผ ํธ์ถํ์ฌ ๋ด์ ์์คํ ๋ฐ๋ชฌ ํ์ผ์ ์ง์ ๊ฐ๋ณต(Open)ํฉ๋๋ค. ์๋ ๋ช ๋ น์ด์ [์ฌ์ฉ์๋ด์ด๋ฆ]์ ๋ณธ์ธ์ด ์ค์ ํ ๋ฐ๋ชฌ ์ด๋ฆ์ผ๋ก ์นํํ์ญ์์ค.
๐ธ ์๋ํฐ๊ฐ ์ด๋ฆฌ๋ฉด, ์๋์ ๋ฌด๊ฒฐ์ ์ํคํ ์ฒ ํ ์คํธ๋ฅผ ๋ณต์ฌํ์ฌ ํ์ผ ๋ด๋ถ์ ๋ฎ์ด์ฐ๊ธฐ ํ์ญ์์ค. (๋ฐ๋์ [์ฌ์ฉ์๊ณ์ ๋ช ]๊ณผ [์ฌ์ฉ์๋ด์ด๋ฆ]์ ๋ณธ์ธ์ ๋ฆฌ๋ ์ค ํ๊ฒฝ์ ๋ง๊ฒ ํฉํธ ๊ต์ ํด์ผ ํฉ๋๋ค.)
๐ธ ์ฝ๋ ์ฃผ์ ์ด ์๋ฃ๋์๋ค๋ฉด ํ์ผ์ ์ ์ฅํ๊ณ ์๋ํฐ๋ฅผ ํ์ถํฉ๋๋ค. (nano ์๋ํฐ ๊ธฐ์ค: Ctrl+O โ Enter โ Ctrl+X ์์๋ก ๊ฒฉ๋ฐ)
๐น ํ์ ๋ฌด๊ฒฐ์ฑ ํ ์คํธ ๋ฐ ๋ฐ๋ชฌ ์ฌ๊ฐ๋ ์ํ์ค
๐ธ OS ์ฝ์ด์ ๋ฐฉ๊ธ ๋ณ๊ฒฝ๋ ํฉํธ๋ฅผ ์๊ตฌ ๊ฐ์ธ์ํค๊ณ (fsync ํจ๊ณผ), ๋ฐ๋ชฌ์ ๋ค์ ๊นจ์ฐ๊ธฐ ์ํด ์๋ ๋ ๋ช ๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์์ ์ฌ๋ฆฌ์ญ์์ค.
๐ธ ์ ๋ฆด๋ก๋ ๋ฐ ์ฌ๊ฐ๋ ์ํ์ค๋ฅผ ์์ํ์ ๋ค, ํ ๋ ๊ทธ๋จ ๋ด ์งํ์์ ์ ์ํ์ฌ /update ์ปค๋งจ๋๋ฅผ ๊ฒฉ๋ฐํ์ญ์์ค.
๐ธ ๋ด์ด OS ํ๊ฒฝ๋ณ์(daemon_name)๋ฅผ ์ ์์ ์ผ๋ก ์ถ์ถํด๋ด์ด ์์คํ ๋ฐ๋ชฌ์ ์ฑ๊ณต์ ์ผ๋ก ์๊ฐ ์ฌ์์ํ๋์ง ํฉํธ ์ฒดํฌ๋ฅผ ์๋ฃํ๋ฉด, ์ด๋ ํ ๊ฐํนํ ํ๊ฒฝ์์๋ ์ฃฝ์ง ์๋ ๋ฐฉํ ์ข๋น ๋ด ์ํคํ ์ฒ ๊ตฌ์ถ์ด ์ต์ข ์๋ฃ๋ฉ๋๋ค. ๐