๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ› ๏ธ

[systemd] ์„œ๋ฒ„ reboot ์‹œ ์„œ๋น„์Šค ์ž๋™ ์‹คํ–‰

by ๋ฐ”์ฟ„๋ฆฌ 2025. 1. 6.

๊ฐœ์š”

์›๊ฒฉ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ reboot ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ์›๊ฒฉ ์„œ๋ฒ„์—์„œ ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๋“ค์ด ๋‹ค ๋‚ด๋ ค๊ฐ€์„œ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰์‹œ์ผœ์•ผ ํ–ˆ๋‹ค.

์ด ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์—†์• ๊ณ ์ž, ์›๊ฒฉ ์„œ๋ฒ„ reboot ๋˜์—ˆ์„ ๋•Œ ์ž๋™์ ์œผ๋กœ ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋ฐฉ๋ฒ•

1. systemd์— ์ถ”๊ฐ€

2. crontab์— ์ถ”๊ฐ€

๋ฐฉ๋ฒ• 1๏ธโƒฃ systemd

1. ์„œ๋น„์Šค ํŒŒ์ผ ์ƒ์„ฑ

sudo vim /etc/systemd/system/my_service.service

 

2. ์„œ๋น„์Šค ํŒŒ์ผ ์ž‘์„ฑ

[Unit]
Description=Activate service automatically when rebooting this server.
After=network.target

[Service]
ExecStart=/bin/bash -c "source /home/my_name/anaconda3/etc/profile.d/conda.sh && conda activate /home/my_name/.conda/envs/my_env && python /home/my_name/my_service/main.py"
Restart=always
User=my_name
WorkingDirectory=/home/my_name/my_service
StandardOutput=append:/home/my_name/my_service/logfile.log
StandardError=append:/home/my_name/my_service/errorfile.log

[Install]
WantedBy=multi-user.target
  • ExecStart
    • source /home/my_name/anaconda3/etc/profile.d/conda.sh
      • conda๋ฅผ ์ดˆ๊ธฐํ™”
      • conda.sh ์Šคํฌ๋ฆฝํŠธ๋Š” Conda ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”
    • conda activate /home/my_name/.conda/envs/my_env
      • ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”
    • python /home/my_name/my_service/main.py
      • ํ™˜๊ฒฝ ํ™œ์„ฑํ™” ํ›„ ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์ •

3. ์„œ๋น„์Šค ํ™œ์„ฑํ™” ๋ฐ ์‹คํ–‰

sudo systemctl daemon-reload
sudo systemctl enable my_service.service
sudo systemctl start my_service.service

 

4. ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ

$ sudo systemctl status my_service.service

โ— my_service.service - Activate service automatically when rebooting this server.
     Loaded: loaded (/etc/systemd/system/my_service.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-01-06 14:33:08 KST; 1min 18s ago
   Main PID: 3239090 (python)
      Tasks: 4 (limit: 154179)
     Memory: 118.7M
     CGroup: /system.slice/my_service.service
             โ”œโ”€3239090 python /home/my_name/my_service/app/main.py
             โ”œโ”€3239101 /home/my_name/.conda/envs/my_service/bin/python -c from multiprocessing.resource_tracker import main;main(5)
             โ””โ”€3239102 /home/my_name/.conda/envs/my_service/bin/python -c from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=6, pipe_handle=8) --multi>

 1์›” 06 14:33:08 workstation systemd[1]: Started Activate service automatically when rebooting this server..

 

๋ฐฉ๋ฒ• 2๏ธโƒฃ crontab

1. crontab ํŽธ์ง‘

crontab -e

 

2. ๋ถ€ํŒ… ์‹œ ์‹คํ–‰ ๋ช…๋ น ์ถ”๊ฐ€

@reboot /bin/bash -c "source /home/dde/anaconda3/etc/profile.d/conda.sh && conda activate /home/cvteam/.conda/envs/GradelWeb && python /home/my_name/my_service/main.py > /home/my_name/my_service/logfile.log 2>&1 &"

 

3. ํ…Œ์ŠคํŠธ

- ์„œ๋ฒ„ ์žฌ๋ถ€ํŒ… ํ›„ ์‹คํ–‰ ์—ฌ๋ถ€ ํ™•์ธ

ps aux | grep main.py

 

๐Ÿ“ ์ •๋ฆฌ

crontab๋ณด๋‹ค systemd๋ฅผ ์ถ”์ฒœํ•˜๋Š” ์ด์œ ๋Š” ๊ธฐ๋Šฅ์„ฑ, ์œ ์—ฐ์„ฑ, ๊ด€๋ฆฌ์„ฑ ๋•Œ๋ฌธ!

ํŠนํžˆ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์•ˆ์ •์ ์ด๊ณ  ์ง๊ด€์ ์ธ ์„œ๋น„์Šค ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— systemd๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค !!

 

- ์„œ๋น„์Šค ๊ด€๋ฆฌ

systemd๋Š” ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘, ์ค‘์ง€, ์žฌ์‹œ์ž‘, ์ƒํƒœ ํ™•์ธ ๋“ฑ์˜ ๋ช…๋ น์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค:

sudo systemctl start my_service
sudo systemctl stop my_service
sudo systemctl restart my_service
sudo systemctl status my_service

rontab์€ ์ด๋Ÿฌํ•œ ์ œ์–ด ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋””๋ฒ„๊น…๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค.

 

- ๋กœ๊ทธ ๊ด€๋ฆฌ

systemd๋Š” ์„œ๋น„์Šค์˜ ํ‘œ์ค€ ์ถœ๋ ฅ๊ณผ ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ์ €์žฅํ•˜๊ณ , journalctl ๋ช…๋ น์–ด๋กœ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค:

journalctl -u my_service

crontab์—์„œ๋Š” ์ถœ๋ ฅ์ด๋‚˜ ์˜ค๋ฅ˜๋ฅผ ํŒŒ์ผ๋กœ redirectionํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณ„๋„๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋””๋ฒ„๊น…์ด ๋ณต์žกํ•˜๋‹ค.

 

- ์ž๋™ ์žฌ์‹œ์ž‘ ๋ฐ ๋ณต๊ตฌ

systemd๋Š” ์„œ๋น„์Šค๊ฐ€ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค:

[Service]
Restart=always
RestartSec=5

์ด๋Š” ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค์—์„œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

crontab์—๋Š” ์ด๋Ÿฌํ•œ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์–ด, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ˆ˜๋™ ๊ฐœ์ž…์ด ํ•„์š”ํ•˜๋‹ค.

 

- ์˜์กด์„ฑ ๊ด€๋ฆฌ

systemd๋Š” ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค:

[Unit]
After=network.target

์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ๊ฐ€ ์ค€๋น„๋œ ํ›„์—๋งŒ ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

crontab์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ , ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ๋ชจ๋“  ์ค€๋น„๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.