บางครั้งคุณต้องการให้แอปหรือสคริปต์ทำงานต่อเนื่องไม่ว่าคุณจะล็อกอินเข้าคอมพิวเตอร์หรือไม่ ก็ตาม อาจเป็นสคริปต์ PowerShell สำหรับตรวจสอบพอร์ต หรือเว็บเซิร์ฟเวอร์โฮสต์หน้าเว็บในเครือข่ายบ้าน
จุดสำคัญคือ หากคุณต้องการให้กระบวนการ สคริปต์ หรือโปรแกรมทำงานตลอดเวลาที่คอมพิวเตอร์เปิดอยู่ คุณจะต้องสร้าง Windows Service
สิ่งที่ต้องมีเพื่อสร้าง Windows Service
ในการสร้าง Windows Service ใน Windows 10 มีข้อกำหนดเบื้องต้นดังนี้:
- สิทธิ์ Administrator บนคอมพิวเตอร์
- สิ่งที่ต้องการรันเป็นบริการ (PowerShell Script, โปรแกรม, ฯลฯ)
- ติดตั้ง Non-Sucking Service Manager (NSSM)
Non-Sucking Service Manager (NSSM) คืออะไร?
ใช่ ชื่อดังกล่าวดูแปลกแต่แม่นยำ NSSM เป็นวิธีที่ง่ายที่สุดในการสร้าง Windows Service ที่น่าเชื่อถือและกำหนดค่าได้มากที่สุด เพราะว่ามันฟรีและเป็น Open Source Software (OSS)
NSSM ใช้งานได้ทั้งผ่าน Command Prompt และ GUI ทำให้ทุกคนใช้งานได้ รองรับ Windows ตั้งแต่ Windows 2000 เป็นต้นมา มีทั้ง 32-bit และ 64-bit หากใช้คอม 64-bit ให้ลองเวอร์ชัน 64-bit ก่อน ไม่ได้ให้ลอง 32-bit
ดาวน์โหลด NSSM ได้จากเว็บไซต์ Clone จาก Git หรือติดตั้งผ่าน Chocolatey (Package Manager สำหรับ Windows) วิธีการติดตั้งแตกต่างกันไป ขอแนะนำดูคำแนะนำของ NSSM ในตัวอย่างนี้เราจะดาวน์โหลดจากเว็บไซต์และติดตั้งที่ C:\WINDOWS\system32
สร้าง Windows Service ด้วย NSSM
ตัวอย่างนี้จะสร้างบริการจากสคริปต์ PowerShell เพื่อบันทึกเปอร์เซ็นต์โหลด CPU เฉลี่ย
- คัดลอกและบันทึกสคริปต์นี้เป็น log-CPULoadPercentage.ps1 ไว้ที่ไดเรกทอรีที่ไม่ค่อยถูกเข้าถึง เช่น สร้างโฟลเดอร์ C:/Scripts และเก็บไว้ที่นั่น สร้างโฟลเดอร์ Logs ใน Scripts ด้วย หมายเหตุ: พาธของสคริปต์คือ C:/Scripts/log-CPULoadPercentage.ps1 จะต้องใช้ภายหลัง
หมายเหตุ: บรรทัดที่มี # ต่อท้ายคือคอมเมนต์ ไม่ส่งผลต่อสคริปต์
CLS #Optional. ชอบเคลียร์เทอร์มินอลตอนทดสอบ #ตรวจสอบว่ามีโฟลเดอร์ Logs อยู่ในไดเรกทอรีเดียวกับสคริปต์ #Log คือที่จัดเก็บบันทึก Start-Transcript -Path "$PSScriptRoot\Logs\log-CPULoadPercentage-$(get-date -f yyyy-MM-dd).txt" -Append #While loop ทำให้รันต่อเนื่องจนกว่าจะหยุดด้วยตนเอง While ($True){ #สร้าง timestamp รู้ว่าวัดเมื่อไหร่ $timeStamp = get-date -f yyyy-MM-h:mm:ss #ดึงเปอร์เซ็นต์โหลดเฉลี่ย แล้วรอ 5 วินาที วัดอีกครั้ง $cpuLoadPercent = Get-CimInstance win32_processor | Measure-Object -Property LoadPercentage -Average | Select-Object Average;Start-Sleep -Seconds 5 #แยกค่าเฉลี่ยอย่างเดียว ไม่ให้สตริงแปลกๆ $cpuLoadPercent = $cpuLoadPercent.Average #เขียนผลลัพธ์ไปที่หน้าจอ หรือในกรณีนี้คือ log Write-Host "$timeStamp CPU Load Percentage $cpuLoadPercent" } Stop-Transcript
- ทำได้ทั้ง Windows Command Prompt หรือ PowerShell เปิดแบบ Administrator
- พิมพ์คำสั่ง nssm install logCPUAvg และรัน จะเปิดหน้าต่าง NSSM service installer
- คลิกปุ่ม ellipses (...) ถัดจากฟิลด์ Path: ไปที่ powershell.exe ปกติอยู่ที่ C:\Windows\System32\ เลือก powershell.exe ฟิลด์ Path: และ Startup directory: จะถูกกรอกอัตโนมัติ
- ในฟิลด์ Arguments: ใส่: -ExecutionPolicy Bypass -NoProfile -File "C:\PathToScript\get-Script.ps1" โดยส่วนท้ายคือพาธและชื่อสคริปต์ PowerShell ของคุณ
- เลือกแท็บ Details ใส่ชื่อที่ต้องการแสดงใน Windows Services Manager ในฟิลด์ Display name: และคำอธิบายใน Description: Startup type: ตั้งเป็น Automatic, Automatic (Delayed Start), Manual, หรือ Disabled สำหรับตัวอย่าง Automatic ก็พอ
- เลือกแท็บ Log on เลือก radio button This account: ใส่บัญชีและรหัสผ่านที่บริการจะรันภายใต้ ควรสร้างบัญชี Windows แยกสำหรับรันบริการนี้ สิทธิ์ควรจำกัดเฉพาะสิ่งที่บริการต้องการ ใช้ Local System account ได้แต่ไม่แนะนำเพื่อเหตุผลด้านความปลอดภัย
มีแท็บอื่นๆ อีกหลายแท็บสำหรับปรับแต่งบริการ สำหรับตัวอย่างนี้ค่าเริ่มต้นพอ กดปุ่ม Install service
- เมื่อติดตั้งบริการสำเร็จ จะเห็นหน้าต่าง Service "logCPUAvg" installed successfully! กด OK ปิด จบการติดตั้ง
- เปิด Windows Services Manager ตรวจสอบว่าบริการมีอยู่จริง
- รันบริการเพื่อทดสอบว่าทำงานได้
- เพื่อยืนยันว่าบริการทำงานอยู่ ใช้ File Explorer ไปที่ตำแหน่งที่ควรบันทึก log ดูว่ามีไฟล์หรือไม่
ลบ Windows Service ด้วย NSSM
หากไม่ต้องการตรวจสอบโหลด CPU แล้ว ต้องการลบบริการ NSSM ทำได้ง่าย:
- ใน Windows Services Manager หยุดบริการโดยเลือกบริการ Log CPU Average Load แล้วกดปุ่ม stop สี่เหลี่ยมบน 툴บาร์ หรือลิงก์ Stop the service ด้านซ้าย
- เปิด Windows Command Prompt หรือ PowerShell แบบ Administrator
- พิมพ์คำสั่ง nssm remove logCPUAvg และรัน
- NSSM จะขอยืนยัน เลือก Yes
- เมื่อลบสำเร็จ จะเห็น Service "logCPUAvg" removed successfully! กด OK เสร็จสิ้น
ควรตรวจ Services Manager อีกครั้งว่าบริการหายไปแล้ว หากยังเห็น ให้รีเฟรชหน้าจอ ควรจะหายไป
บริการเหล่านี้เหมาะสำหรับรันแอปหรือสคริปต์ที่ต้องทำงานตลอดเวลา รีสตาร์ทตัวเองหากล้มเหลว หรือต้องการสิทธิ์ต่างจากผู้ใช้ปัจจุบัน หากไม่ต้องการคุณสมบัติเหล่านี้ ให้พิจารณาใช้ Scheduled Task แทน