πŸ› οΈ

[systemd] μ„œλ²„ reboot μ‹œ μ„œλΉ„μŠ€ μžλ™ μ‹€ν–‰

바쿄리 2025. 1. 6. 15:09

κ°œμš”

원격 μ„œλ²„μ— λ¬Έμ œκ°€ λ°œμƒν•΄μ„œ 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μ—μ„œλŠ” 이와 같은 μ˜μ‘΄μ„± 관리가 μ–΄λ ΅κ³ , 슀크립트 λ‚΄λΆ€μ—μ„œ λͺ¨λ“  μ€€λΉ„λ₯Ό μˆ˜λ™μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.