نصب و تنظیم سرویس اجرای دوره‌ای برنامه پیامک با WinSW

1) هدف

این راهنما برای اجرای دوره‌ای برنامه پیامک به‌صورت Windows Service با استفاده از WinSW تهیه شده است، بدون استفاده از Task Scheduler.


2) ساختار فایل‌ها و مسیرها

مسیر برنامه پیامک

D:\SMSSender\iMaster.ERP.SmsSender.Console.exe

مسیر فایل سرویس WinSW

D:\SmsService\SmsRunnerService.exe

فایل تنظیمات سرویس

D:\SmsService\SmsRunnerService.xml

فایل اسکریپت اجرای حلقه‌ای

D:\SmsService\run-loop.ps1

فایل لاگ برنامه

D:\SmsService\runner.log

پوشه لاگ‌های WinSW

D:\SmsService\logs

3) نکات مهم در نام‌گذاری و مسیرها


4) نصب و راه‌اندازی

مرحله 1: ایجاد پوشه‌ها

درایو و پوشه‌های زیر باید وجود داشته باشند:

D:\SMSSender\
D:\SmsService\
D:\SmsService\logs\

مرحله 2: قرار دادن فایل‌ها

مرحله 3: نصب سرویس

CMD یا PowerShell را با Run as Administrator باز کنید و دستورهای زیر را اجرا کنید.

دستورهای نصب سرویس

cd /d D:\SmsService
SmsRunnerService.exe install
SmsRunnerService.exe start

مرحله 4: تنظیم Recovery سرویس

برای ری‌استارت خودکار سرویس در صورت خطا:

دستورهای Recovery

sc failure SmsRunnerService reset= 86400 actions= restart/5000/restart/10000/restart/60000
sc config SmsRunnerService start= auto

5) فایل‌های تنظیمات

فایل run-loop.ps1

نمایش کد فایل PowerShell

$exePath = "D:\SMSSender\iMaster.ERP.SmsSender.Console.exe"
$processName = "iMaster.ERP.SmsSender.Console"
$intervalSeconds = 60
$logFile = "D:\SmsService\runner.log"

while ($true) {
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

    try {
        $alreadyRunning = Get-Process -Name $processName -ErrorAction SilentlyContinue

        if (-not $alreadyRunning) {
            Add-Content $logFile "[$timestamp] Starting $exePath"

            $process = Start-Process -FilePath $exePath -PassThru
            $process.WaitForExit()

            $exitCode = $process.ExitCode
            Add-Content $logFile "[$timestamp] Finished with exit code $exitCode"
        }
        else {
            Add-Content $logFile "[$timestamp] Process already running. Skipped."
        }
    }
    catch {
        Add-Content $logFile "[$timestamp] ERROR: $($_.Exception.Message)"
    }

    Start-Sleep -Seconds $intervalSeconds
}

فایل SmsRunnerService.xml

نمایش کد فایل XML سرویس

<service>
  <id>SmsRunnerService</id>
  <name>SMS Runner Service</name>
  <description>Runs iMaster.ERP.SmsSender.Console.exe every 1 minute</description>

  <executable>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</executable>
  <arguments>-NoProfile -ExecutionPolicy Bypass -File "D:\SmsService\run-loop.ps1"</arguments>

  <logpath>D:\SmsService\logs</logpath>
  <log mode="roll-by-size">
    <sizeThreshold>10240</sizeThreshold>
    <keepFiles>8</keepFiles>
  </log>

  <startmode>Automatic</startmode>

  <onfailure action="restart" delay="10 sec"/>
  <onfailure action="restart" delay="30 sec"/>
  <onfailure action="restart" delay="1 min"/>
</service>

6) تست فعال بودن سرویس

روش 1: بررسی در Services

پنجره سرویس‌ها را باز کنید:

services.msc

سرویس زیر باید وجود داشته باشد و در حالت Running باشد:

SMS Runner Service

روش 2: بررسی از خط فرمان

دستور بررسی وضعیت سرویس

sc query SmsRunnerService

اگر سرویس فعال باشد، وضعیت آن باید شبیه RUNNING باشد.

روش 3: بررسی فایل لاگ برنامه

فایل زیر را بررسی کنید:

D:\SmsService\runner.log

اگر سرویس درست کار کند، ورودهای جدید در لاگ ثبت می‌شود.

روش 4: بررسی لاگ‌های WinSW

پوشه زیر را بررسی کنید:

D:\SmsService\logs

7) تنظیم زمان اجرای برنامه

زمان اجرای مجدد برنامه از این متغیر در فایل run-loop.ps1 کنترل می‌شود:

$intervalSeconds = 60

نمونه‌ها

بعد از تغییر این مقدار، سرویس را ری‌استارت کنید:

دستور ری‌استارت سرویس

D:\SmsService\SmsRunnerService.exe restart

8) دستورات کاربردی مدیریت سرویس

نمایش دستورهای Start / Stop / Restart / Uninstall

D:\SmsService\SmsRunnerService.exe start
D:\SmsService\SmsRunnerService.exe stop
D:\SmsService\SmsRunnerService.exe restart
D:\SmsService\SmsRunnerService.exe uninstall

9) نکات عملیاتی مهم


10) جمع‌بندی

در این ساختار: