์๊ฐ
Linux์ฉ์ผ๋ก ๊ฐ๋ฐํ ๋ ์์คํ ์ ์ผ๊ฑฐ๋ ์ข ๋ฃํ ๋ ์คํ๋๋ ๋ํํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ์์ ์ด ๋ฐ์ํฉ๋๋ค. ์์คํ V์์๋ ์ด๊ฒ์ด ์ฌ์ ์ง๋ง systemd๋ฅผ ์ฌ์ฉํ๋ฉด ์กฐ์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฒด ํ์ด๋จธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์ ๋ชฉํ๊ฐ ํ์ํ๊ฐ์?
๋์์ ์์คํ V -init์์ ์คํ ์์ค๊ณผ ์ ์ฌํ ์ญํ ์ ํ๋ค๊ณ ์ข ์ข ๊ธฐ๋ก๋ฉ๋๋ค. ๋๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋์ํ์ง ์์ต๋๋ค. ๋ ๋ง์ ์๋น์ค๊ฐ ์์ผ๋ฉฐ ํจํค์ง๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ์์ผ๋ฉฐ, ์๋ฅผ ๋ค์ด ํ๋์ ๋ช ๋ น์ผ๋ก ์๋น์ค ๊ทธ๋ฃน์ ์์ํ๊ณ ์ถ๊ฐ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ๊ณ์ธต ๊ตฌ์กฐ๋ ์๊ณ ์ข ์์ฑ๋ง ์์ต๋๋ค.
๋ํํ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ํ์ฑํ๋ ๋์์ ์(๊ธฐ๋ฅ ๊ฐ์)
๋์ ์์ฒด์ ๋ํ ์ค๋ช :
cat installer.target
[Unit]
Description=My installer
Requires=multi-user.target
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes
Wants=installer.service
์ด ๋์์ multi-user.target์ด ์์๋๊ณ installer.service๋ฅผ ํธ์ถํ ๋ ์์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฌํ ์๋น์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์ ์์ต๋๋ค.
cat installer.service
[Unit]
# ะพะฟะธัะฐะฝะธะต
Description=installer interactive dialog
[Service]
# ะะฐะฟัััะธัั ะพะดะธะฝ ัะฐะท, ะบะพะณะดะฐ ะพััะฐะปัะฝะพะต ะฑัะดะตั ะทะฐะฟััะตะฝะฝะพ
Type=idle
# ะะพะผะฐะฝะดะฐ ะทะฐะฟััะบะฐ - ะฒัะทะพะฒ ัะบัะธะฟัะฐ
ExecStart=/usr/bin/installer.sh
# ะะฝัะตัะฐะบัะธะฒะฝะพะต ะฒะทะฐะธะผะพะดะตะนััะฒะธะต ั ะฟะพะปัะทะพะฒะฐัะตะปะตะผ ัะตัะตะท tty3
StandardInput=tty
TTYPath=/dev/tty3
TTYReset=yes
TTYVHangup=yes
[Install]
WantedBy=installer.target
๋ง์ง๋ง์ผ๋ก ์คํ๋๋ ์คํฌ๋ฆฝํธ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#!/bin/bash
# ะะตัะตั
ะพะดะธะผ ะฒ tty3
chvt 3
echo "Install, y/n ?"
read user_answer
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์์คํ
์ด ์์ ์ ๋์ฐฉํด์ผ ํ๋ ๋์์ธ final.target์ ์ ํํ๋ ๊ฒ์
๋๋ค. ์์ ํ๋ก์ธ์ค ์ค์ systemd๋ ์ข
์์ฑ์ ๊ฒํ ํ๊ณ ํ์ํ ๋ชจ๋ ๊ฒ์ ์์ํฉ๋๋ค.
final.target์ ์ ํํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ ๋ ์ด๋ฅผ ์ํด ๋ก๋ ์ต์
์ ์ฌ์ฉํ์ต๋๋ค.
์ต์ข ์ถ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ถํธ๋ก๋๊ฐ ์์๋ฉ๋๋ค
- ๋ถํธ๋ก๋๋ final.target ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ์ฌ ํ์จ์ด ์คํ์ ์์ํฉ๋๋ค.
- Systemd๊ฐ ์์คํ ์ ์์ํ๊ธฐ ์์ํฉ๋๋ค. ํด๋น ์ข ์ ํญ๋ชฉ(์: multi-user.target)์ ํตํด basic.target์์ installer.target ๋๋ work.target์ผ๋ก ์์ฐจ์ ์ผ๋ก ์ด๋ํฉ๋๋ค. ํ์๋ ์์คํ ์ ์ํ๋ ๋ชจ๋๋ก ์๋์ํต๋๋ค.
์ถ์๋ฅผ ์ํ ํ์จ์ด ์ค๋น
ํ์จ์ด๋ฅผ ์์ฑํ ๋ ์์ ์ ์์คํ ์ํ๋ฅผ ๋ณต์ํ๊ณ ์ข ๋ฃ ์ ์ ์ฅํ๋ ์์ ์ด ํญ์ ๋ฐ์ํฉ๋๋ค. ์ํ๋ ๊ตฌ์ฑ ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋คํ, ์ธํฐํ์ด์ค ์ค์ ๋ฑ์ ์๋ฏธํฉ๋๋ค.
Systemd๋ ๋์ผํ ๋์์์ ํ๋ก์ธ์ค๋ฅผ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค. ์คํฌ๋ฆฝํธ์ ์์ ์์๋ฅผ ๊ฒฐ์ ํ ์ ์๋ ์ข ์์ฑ์ด ์์ต๋๋ค.
๋ด ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ์๋ํ๋์(
- ์์คํ ์ด ์์๋ฉ๋๋ค
- settings_restore.service ์๋น์ค๊ฐ ์์๋์ด ๋ฐ์ดํฐ ์น์
์ settings.txt ํ์ผ์ด ์๋์ง ํ์ธํฉ๋๋ค. ์์ผ๋ฉด ์ฐธ์กฐ ํ์ผ์ด ํด๋น ์์น์ ๋ฐฐ์น๋๊ณ ์์คํ
์ค์ ์ด ๋ณต์๋ฉ๋๋ค.
- ๊ด๋ฆฌ์ ๋น๋ฐ๋ฒํธ
- ํธ์คํธ ์ด๋ฆ,
- ์๊ฐ๋
- ์ฅ์
- ๋ชจ๋ ๋ฏธ๋์ด๊ฐ ์ฌ์ฉ๋๊ณ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง ํฌ๊ธฐ๋ ์์์ ๋ฏธ๋์ด์ ์ฝ๊ฒ ๋ณต์ฌํ๊ณ ๊ธฐ๋กํ ์ ์์ต๋๋ค. ์์ ์ ์์ง ์ฌ์ฉ๋์ง ์์ ๊ณต๊ฐ์ด ์๋์ง ํ์ธํฉ๋๋ค. ์๋ ๊ฒฝ์ฐ ๋์คํฌ๊ฐ ๋ค์ ํํฐ์ ๋ฉ๋๋ค.
- MAC ์ฃผ์์์ ๋จธ์ ID๋ฅผ ์์ฑํ๋ ์ค์ ๋๋ค. ์ด๋ DHCP๋ฅผ ํตํด ๋์ผํ ์ฃผ์๋ฅผ ์ป๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋คํธ์ํฌ ์ค์
- ๋ก๊ทธ ํฌ๊ธฐ ์ ํ
- ์ธ๋ถ ๋๋ผ์ด๋ธ๊ฐ ์์ ์ค๋น ์ค์ ๋๋ค(ํด๋น ์ต์ ์ด ํ์ฑํ๋์ด ์๊ณ ๋๋ผ์ด๋ธ๊ฐ ์ ๋๋ผ์ด๋ธ์ธ ๊ฒฝ์ฐ).
- ํฌ์คํธ๊ทธ๋ ์ค ์์
- ๋ณต์ ์๋น์ค๊ฐ ์์๋ฉ๋๋ค. zabbix ์์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๋นํ๋ ๋ฐ ํ์ํฉ๋๋ค.
- ์ด๋ฏธ zabbix ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ด๊ธฐํ ๋คํ(zabbix์ ํฌํจ)์์ ์์ฑ๋ฉ๋๋ค.
- ์๊ฐ๋ ๋ชฉ๋ก์ด ์์ฑ๋ฉ๋๋ค(์น ์ธํฐํ์ด์ค์ ํ์ํ๋ ๋ฐ ํ์ํจ).
- ํ์ฌ IP๊ฐ ๋ฐ๊ฒฌ๋์ด ์ด์๋ก ํ์๋ฉ๋๋ค(์ฝ์์ ๋ก๊ทธ์ธํ๋ผ๋ ์ด๋)
- ์ด๋๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค. Ready to work๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋ํ๋ฉ๋๋ค.
- ํ์จ์ด๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์์ต๋๋ค.
์๋น์ค ํ์ผ์ ์ค์ํ๋ฉฐ ์์ ์์๋ฅผ ์ค์ ํ๋ ํ์ผ์ ๋๋ค.
[Unit]
Description=restore system settings
Before=network.service prepare.service postgresql.service systemd-networkd.service systemd-resolved.service
[Service]
Type=oneshot
ExecStart=/usr/bin/settings_restore.sh
[Install]
WantedBy=multi-user.target
๋ณด์๋ค์ํผ ์ ๋ ์คํฌ๋ฆฝํธ๊ฐ ๋จผ์ ์๋ํ๋๋ก ์ข ์์ฑ์ ์ค์นํ ๋ค์ ๋คํธ์ํฌ๊ฐ ๊ฐ๋๋๊ณ DBMS๊ฐ ์์๋๋๋ก ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์๋น์ค (zabbix ์ค๋น)
#!/bin/sh
[Unit]
Description=monitor prepare system
After=postgresql.service settings_restore.service
Before=zabbix-server.service zabbix-agent.service
[Service]
Type=oneshot
ExecStart=/usr/bin/prepare.sh
[Install]
WantedBy=multi-user.target
์ฌ๊ธฐ์๋ ์ข ๋ ๋ณต์กํฉ๋๋ค. ์์์ multi-user.target์๋ ์์ง๋ง postgresql DBMS์ ์ค์ ๋ณต์์ ์์ํ ํ์ ์ด๋ฃจ์ด์ง๋๋ค. ํ์ง๋ง zabbix ์๋น์ค๋ฅผ ์์ํ๊ธฐ ์ ์.
logrotate๋ฅผ ์ํ ํ์ด๋จธ ์๋น์ค
Systemd๋ CRON์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ง์งํ๊ฒ. ๋ํ ์ ํ๋๋ ๋ถ ๋จ์๊ฐ ์๋๋ผ ์ด ๋จ์๊น์ง์
๋๋ค.(ํ์ํ ๊ฒฝ์ฐ) ๋๋ ์ด๋ฒคํธ์ ์๊ฐ ์ด๊ณผ๋ก ํธ์ถ๋๋ ๋จ์กฐ๋ก์ด ํ์ด๋จธ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
๋ด๊ฐ ๋ง๋ ๊ธฐ๊ณ์ ์์๋ถํฐ ์๊ฐ์ ์ธ๋ ๋จ์กฐ๋ก์ด ํ์ด๋จธ์๋ค.
2๊ฐ์ ํ์ผ์ด ํ์ํฉ๋๋ค.
logrotateTimer.service - ์๋น์ค์ ์ค์ ์ค๋ช
:
[Unit]
Description=run logrotate
[Service]
ExecStart=logrotate /etc/logrotate.conf
TimeoutSec=300
๊ฐ๋จํฉ๋๋ค. ์คํ ๋ช
๋ น์ ๋ํ ์ค๋ช
์
๋๋ค.
๋ ๋ฒ์งธ ํ์ผ logrotateTimer.timer๋ ํ์ด๋จธ๊ฐ ์๋ํ๋ ์์น์
๋๋ค.
[Unit]
Description=Run logrotate
[Timer]
OnBootSec=15min
OnUnitActiveSec=15min
[Install]
WantedBy=timers.target
์ฌ๊ธฐ์ ๋ฌด์์ด ์์ต๋๊น?
- ํ์ด๋จธ ์ค๋ช
- ์ต์ด ์์ ์๊ฐ, ์์คํ ๋ถํ ๋ถํฐ ์์
- ์ถ๊ฐ ์ถ์ ๊ธฐ๊ฐ
- ํ์ด๋จธ ์๋น์ค์ ๋ํ ์ข ์์ฑ์ ๋๋ค. ์ค์ ๋ก ์ด๊ฒ์ ํ์ด๋จธ๋ฅผ ๋ง๋๋ ๋ฌธ์์ด์ ๋๋ค.
์ข ๋ฃ ์ ๋ํํ ์คํฌ๋ฆฝํธ ๋ฐ ์ข ๋ฃ ๋์
๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์๋ ๋ง์ ์์ ์ ์ํํ๊ธฐ ์ํด ์์ฒด ํ๊ฒ์ ํตํด ๊ธฐ๊ณ๋ฅผ ๋๋ ๋ ๋ณต์กํ ๋ฒ์ ์ ์ํํด์ผ ํ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก RemainAfterExit ์ต์ ์ ์ฌ์ฉํ์ฌ ์์ท ์๋น์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๋ํํ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ค ExecOnStop ์ต์ ์ผ๋ก ์คํ๋๋ ๋ช ๋ น์ TTY ์ธ๋ถ์์ ์คํ๋ฉ๋๋ค! ํ์ธํ๊ธฐ ์ฝ์ต๋๋ค. tty ๋ช ๋ น์ ๋ถ์ฌ๋ฃ๊ณ ์ถ๋ ฅ์ ์ ์ฅํ์ธ์.
๋ฐ๋ผ์ ๋ชฉํ๋ฅผ ํตํด ์ข
๋ฃ๋ฅผ ๊ตฌํํ์ต๋๋ค. 100% ์ ํํ๋ค๊ณ ์ฃผ์ฅํ์ง๋ ์์ง๋ง ํจ๊ณผ๊ฐ ์์ต๋๋ค!
์ํ ๋ฐฉ๋ฒ(์ผ๋ฐ์ ์ธ ์ฉ์ด):
๋๊ตฌ์๊ฒ๋ ์์กดํ์ง ์๋ my_shutdown.target ํ๊ฒ์ ๋ง๋ค์์ต๋๋ค.
my_shutdown.target
[Unit]
Description=my shutdown
AllowIsolate=yes
Wants=my_shutdown.service
์ด ๋์์ผ๋ก ์ด๋ํ๋ฉด(systemctl isolate my_shutdwn.target์ ํตํด) my_shutdown.service ์๋น์ค๊ฐ ์์๋ฉ๋๋ค. ์์ ์ ๊ฐ๋จํฉ๋๋ค. ์ฆ my_shutdown.sh ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ฒ์ ๋๋ค.
[Unit]
Description=MY shutdown
[Service]
Type=oneshot
ExecStart=/usr/bin/my_shutdown.sh
StandardInput=tty
TTYPath=/dev/tty3
TTYReset=yes
TTYVHangup=yes
WantedBy=my_shutdown.target
- ์ด ์คํฌ๋ฆฝํธ ๋ด์์ ํ์ํ ์์ ์ ์ํํฉ๋๋ค. ์ ์ฐ์ฑ๊ณผ ํธ์์ฑ์ ์ํด ๋์์ ๋ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
my_shutdown.sh
#!/bin/bash --login
if [ -f /tmp/reboot ];then
command="systemctl reboot"
elif [ -f /tmp/shutdown ]; then
command="systemctl poweroff"
fi
#ะะพั ะทะดะตัั ะฝัะถะฝัะต ะบะพะผะฐะฝะดั
#ะะฐะฟัะธะผะตั, cp /home/user/data.txt /storage/user/
$command
๋ฉ๋ชจ. /tmp/reboot ๋ฐ /tmp/shutdown ํ์ผ์ ์ฌ์ฉํฉ๋๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ํธ์ถํ ์ ์์ต๋๋ค. ์๋น์ค๋ง ๊ฐ๋ฅํฉ๋๋ค.
ํ์ง๋ง ์ ๋ ์์ ์ ์ ์ฐ์ฑ๊ณผ ๋ณด์ฅ๋ ์์ ์์๋ฅผ ์ป๊ธฐ ์ํด target์ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ๋์ค์ ๋์์ต๋๋ค. ๊ธฐ๊ธฐ๋ฅผ ๋๊ฑฐ๋ ๋ค์ ์์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค:
- ์ฌ๋ถํ , ์ข ๋ฃ ๋ฐ ๊ธฐํ ๋ช ๋ น(์ฌ์ ํ systemctl์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ์)์ ์คํฌ๋ฆฝํธ๋ก ๋ฐ๊พธ๊ณ ์คํฌ๋ฆฝํธ ๋ด์์ my_shutdown.target์ผ๋ก ์ด๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ๋ด๋ถ์ ์คํฌ๋ฆฝํธ๋ systemctl์ ์ง์ ํธ์ถํฉ๋๋ค(์: systemctl ์ฌ๋ถํ ).
- ๋ ๊ฐ๋จํ ์ต์ ์ด์ง๋ง ๋ง์์ ๋ค์ง ์์ต๋๋ค. ๋ชจ๋ ์ธํฐํ์ด์ค์์ shutdown/reboot/other๋ฅผ ํธ์ถํ์ง ๋ง๊ณ ๋์ systemctl isolate my_shutdown.target์ ์ง์ ํธ์ถํ์ญ์์ค.
๋๋ ์ฒซ ๋ฒ์งธ ์ต์ ์ ์ ํํ์ต๋๋ค. systemd์์ ์ฌ๋ถํ (poweroff์ ๊ฐ์)์ systemd์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ๋๋ค.
ls -l /sbin/poweroff
lrwxrwxrwx 1 root root 14 ัะตะฝ 30 18:23 /sbin/poweroff -> /bin/systemctl
๋ฐ๋ผ์ ์ด๋ฅผ ์์ ๋ง์ ์คํฌ๋ฆฝํธ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ฌ๋ถํ
#!/bin/sh
touch /tmp/reboot
sudo systemctl isolate my_shutdown.target
fi
์ถ์ฒ : habr.com