You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

نصب و تنظیم سرویس اجرای دوره‌ای برنامه پیامک با 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) نکات مهم در نام‌گذاری و مسیرها

  • فایل exe مربوط به WinSW و فایل xml باید هم‌نام باشند.
  • در این پروژه:
    • نام فایل سرویس:
      SmsRunnerService.exe
      
    • نام فایل تنظیمات:
      SmsRunnerService.xml
      
  • اگر نام فایل exe سرویس تغییر کند، نام فایل xml هم باید دقیقاً مطابق آن تغییر کند.
  • مسیر فایل‌ها بهتر است ثابت باشد و بعد از نصب تغییر نکند.
  • در صورت تغییر مسیر برنامه پیامک، باید مقدار $exePath در فایل run-loop.ps1 اصلاح شود.
  • در صورت تغییر نام فایل اجرایی برنامه پیامک، مقدار $processName نیز باید اصلاح شود.

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

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

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

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

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

  • فایل برنامه پیامک را در مسیر زیر قرار دهید:
    D:\SMSSender\iMaster.ERP.SmsSender.Console.exe
    
  • فایل WinSW را دانلود کرده و با این نام در این مسیر قرار دهید:
    D:\SmsService\SmsRunnerService.exe
    
  • فایل run-loop.ps1 را در مسیر زیر بسازید:
    D:\SmsService\run-loop.ps1
    
  • فایل SmsRunnerService.xml را در مسیر زیر بسازید:
    D:\SmsService\SmsRunnerService.xml
    

مرحله 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

نمونه‌ها

  • اجرای هر 1 دقیقه:

    $intervalSeconds = 60
    
  • اجرای هر 2 دقیقه:

    $intervalSeconds = 120
    
  • اجرای هر 5 دقیقه:

    $intervalSeconds = 300
    

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

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

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) نکات عملیاتی مهم

  • مسیر فایل‌های سرویس را بعد از نصب تغییر ندهید.
  • اگر نام فایل اصلی برنامه پیامک تغییر کرد، مقدارهای زیر را نیز اصلاح کنید:
    • $exePath
    • $processName
  • اگر فایل runner.log ساخته نشد، دسترسی نوشتن روی مسیر D:\SmsService بررسی شود.
  • اگر سرویس بالا نیامد، ابتدا لاگ‌های داخل D:\SmsService\logs بررسی شوند.
  • این سرویس برای زمانی مناسب است که برنامه پیامک:
    • کوتاه‌مدت اجرا شود
    • رکوردها را ارسال کند
    • بسته شود
    • سپس بعد از زمان مشخص دوباره اجرا شود

10) جمع‌بندی

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

  • WinSW سرویس ویندوز را مدیریت می‌کند
  • PowerShell اجرای دوره‌ای برنامه را انجام می‌دهد
  • runner.log لاگ اجرای برنامه را نگه می‌دارد
  • سرویس بعد از ریبوت سرور به‌صورت خودکار دوباره فعال می‌شود


  • No labels