์‹œ์Šคํ…œํ™”๋œ ๋Œ€ํ™”ํ˜• ์Šคํฌ๋ฆฝํŠธ ๋ฐ ํƒ€์ด๋จธ

์‹œ์Šคํ…œํ™”๋œ ๋Œ€ํ™”ํ˜• ์Šคํฌ๋ฆฝํŠธ ๋ฐ ํƒ€์ด๋จธ

์†Œ๊ฐœ

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์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฅผ ์œ„ํ•ด ๋กœ๋” ์˜ต์…˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข… ์ถœ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ถ€ํŠธ๋กœ๋”๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค
  2. ๋ถ€ํŠธ๋กœ๋”๋Š” final.target ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํŽŒ์›จ์–ด ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  3. Systemd๊ฐ€ ์‹œ์Šคํ…œ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ข…์† ํ•ญ๋ชฉ(์˜ˆ: multi-user.target)์„ ํ†ตํ•ด basic.target์—์„œ installer.target ๋˜๋Š” work.target์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ์‹œ์Šคํ…œ์„ ์›ํ•˜๋Š” ๋ชจ๋“œ๋กœ ์ž‘๋™์‹œํ‚ต๋‹ˆ๋‹ค.

์ถœ์‹œ๋ฅผ ์œ„ํ•œ ํŽŒ์›จ์–ด ์ค€๋น„

ํŽŒ์›จ์–ด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‹œ์ž‘ ์‹œ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ณ  ์ข…๋ฃŒ ์‹œ ์ €์žฅํ•˜๋Š” ์ž‘์—…์ด ํ•ญ์ƒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋คํ”„, ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ • ๋“ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Systemd๋Š” ๋™์ผํ•œ ๋Œ€์ƒ์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ ์‹œ์ž‘ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ข…์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. ์‹œ์Šคํ…œ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค
  2. settings_restore.service ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋˜์–ด ๋ฐ์ดํ„ฐ ์„น์…˜์— settings.txt ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—†์œผ๋ฉด ์ฐธ์กฐ ํŒŒ์ผ์ด ํ•ด๋‹น ์œ„์น˜์— ๋ฐฐ์น˜๋˜๊ณ  ์‹œ์Šคํ…œ ์„ค์ •์ด ๋ณต์›๋ฉ๋‹ˆ๋‹ค.
    • ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ
    • ํ˜ธ์ŠคํŠธ ์ด๋ฆ„,
    • ์‹œ๊ฐ„๋Œ€
    • ์žฅ์†Œ
    • ๋ชจ๋“  ๋ฏธ๋””์–ด๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋Š” ์ž‘์•„์„œ ๋ฏธ๋””์–ด์— ์‰ฝ๊ฒŒ ๋ณต์‚ฌํ•˜๊ณ  ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ณต๊ฐ„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์žˆ๋Š” ๊ฒฝ์šฐ ๋””์Šคํฌ๊ฐ€ ๋‹ค์‹œ ํŒŒํ‹ฐ์…˜๋ฉ๋‹ˆ๋‹ค.
    • MAC ์ฃผ์†Œ์—์„œ ๋จธ์‹  ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๋Š” DHCP๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ์–ป๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋„คํŠธ์›Œํฌ ์„ค์ •
    • ๋กœ๊ทธ ํฌ๊ธฐ ์ œํ•œ
    • ์™ธ๋ถ€ ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ์ž‘์—… ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค(ํ•ด๋‹น ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ  ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ์ƒˆ ๋“œ๋ผ์ด๋ธŒ์ธ ๊ฒฝ์šฐ).
  3. ํฌ์ŠคํŠธ๊ทธ๋ ˆ์Šค ์‹œ์ž‘
  4. ๋ณต์› ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. zabbix ์ž์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฏธ zabbix ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™” ๋คํ”„(zabbix์— ํฌํ•จ)์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ„๋Œ€ ๋ชฉ๋ก์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค(์›น ์ธํ„ฐํŽ˜์ด์Šค์— ํ‘œ์‹œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•จ).
    • ํ˜„์žฌ IP๊ฐ€ ๋ฐœ๊ฒฌ๋˜์–ด ์ด์Šˆ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•˜๋ผ๋Š” ์ดˆ๋Œ€)
  5. ์ดˆ๋Œ€๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. Ready to work๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  6. ํŽŒ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ํŒŒ์ผ์€ ์ค‘์š”ํ•˜๋ฉฐ ์‹œ์ž‘ ์ˆœ์„œ๋ฅผ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

[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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€