เอา App ไปรันเป็น Service บน Linux ผ่าน systemd

แต่ก่อนเวลาเขียน app ที่เป็น standalone มาตัวนึง แล้วต้องการปล่อยให้มัน run บน linux เป็น process ทิ้งไว้ ท่าที่มักจะหยิบมาใช้ก็คือ รันเป็น background process (ใส่ & ปิดท้าย และใช้ nohup ร่วมด้วย) และถ้าต้องการ stop ก็จะใช้วิธี kill process และถ้าอยาก restart ก็ kill แล้วตามด้วย run ใหม่แบบ background

วันนี้ได้รู้จักวิธีใหม่จากดิว คือการใช้ systemd ซึ่งจะช่วยให้เราสามารถ start, stop และ restart app ของเราได้เหมือนเป็น service (daemon) กันเลย

วิธีการทำให้ app ของเราเป็น service ก็ง่ายมาก แค่ไปสร้างไฟล์ <ชื่อ service>.service เอาไว้ใน /etc/systemd/system เช่น ถ้าเราต้องการ service ชื่อ my-service เราก็สร้างไฟล์ /etc/systemd/system/my-service.service โดยมีรายละเอียดข้างในเป็นแบบนี้

[Unit]
Description=<description>

[Service]
WorkingDirectory=/opt/my-service-app
ExecStart=/opt/my-service-app/my-service
Type=simple
Restart=always
RestartSec=10  # Restart service after 10 seconds if service crashes
SyslogIdentifier=my-service-app
User=jenkins
Environment=<environment variable อยากใส่อะไรก็ใส่>
Environment=<environment variable ตัวอื่น ๆ ใส่ได้เรื่อย ๆ>

[Install]
WantedBy=multi-user.target

เช่น สมมติว่าเขียน dotnet core web api มาตัวนึง แล้วทำเป็น self-contained คือ สามารถ run ได้โดยไม่ต้องไปลง dependency อะไรอีกแล้ว (เพราะมันยัดรวมมาให้ทุกอย่างแล้ว) เราก็สามารถทำให้มันกลายเป็น service ได้โดยสร้างไฟล์ /etc/systemd/system/my-web-api.service

[Unit]
Description=My Web API

[Service]
WorkingDirectory=/opt/my-web-api
ExecStart=/opt/my-web-api/my-web-api
Type=simple
Restart=always
RestartSec=10  # Restart service after 10 seconds if service crashes
SyslogIdentifier=my-web-api
User=jenkins
Environment=ASPNETCORE_URLS=http://0.0.0.0:8080
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

ตรง Type จะกำหนดได้หลายแบบ ขึ้นอยู่กับเราเขียน app มาแบบไหน ไปดูเพิ่มเติมใน https://www.freedesktop.org/software/systemd/man/systemd.service.html แต่อันที่เลือกใช้คือ simple เพราะตอน start app ไม่ได้มีการ fork อะไร

ทีนี้ตอนเราอยากจะ start, stop, restart หรืออยากจะให้มัน auto-start หลังจาก system reboot ก็ง่ายละ

  • start: sudo systemctl start my-web-api
  • stop: sudo systemctl stop my-web-api
  • restart: sudo systemctl restart my-web-api
  • auto-start หลังจาก reboot: sudo systemctl enable my-web-api

วิธีนี้จะใช้กับ dotnet core app ก็ได้ หรือ golang app ก็ได้ หรือ app อื่น ๆ ก็ได้ สะดวกขึ้นเยอะเลย

อ้างอิง

Leave a Reply

Your email address will not be published. Required fields are marked *