【问题标题】:Building an application to do a task periodically on a server构建应用程序以在服务器上定期执行任务
【发布时间】:2010-07-12 22:16:30
【问题描述】:

我正在寻找有关我正在构建的这个小系统的整体架构的一些指导。

目前,我有一个通过 xcopy 部署(和更新)到几台服务器的应用程序。这适用于更新代码,但不适用于更新代码的执行周期,因为它被设置为每小时运行的 Windows 计划任务。 xcopy 替换效果很好,因为我可以从本地计算机运行更新,并将新的 exe 文件推送到所有服务器。下一个小时,任务调度程序将运行新的 exe。

我想把它改成这样工作。

我的应用程序作为 Windows 服务运行并使用 System.Threading.Timer 等待给定的持续时间,然后执行代码。这样,部分进程可以检查数据库,并在必要时减少给定服务器的执行时间。

那里的问题是,由于 .exe 将作为服务运行,它不允许通过 xcopy 轻松更新,因为该文件将一直在使用中。

关于我应该如何设置它以便能够进行简单的 xcopy 更新,同时作为 Windows 服务运行的任何想法?这可能吗?

【问题讨论】:

    标签: .net process automation scheduling


    【解决方案1】:

    您可以停止服务,然后复制文件,然后从批处理文件启动服务:

    SET SOURCEDIR=\\coastappsdev\wwwroot\ClearTrac\Setup\03_Staging\ClearTracAutoSend\bin
    SET SERVICE_HOME=C:\INETPUB\WWWROOT\ClearTracAutoSend
    SET SERVICE_EXE=ClearTracAutoSend.exe
    SET INSTALL_UTIL_HOME=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
    
    
    :STOP THE SERVICE:
    SC \\targetServer STOP ClearTracAutoSend
    
    :COPY THE FILES:
    MD %SERVICE_HOME%
    XCOPY %SOURCEDIR%\*.* %SERVICE_HOME%\*.* /E /R /Y
    
    set PATH=%PATH%;%INSTALL_UTIL_HOME%
    
    cd %SERVICE_HOME%
    
    echo Uninstalling AutoSend Service...
    installutil /u %SERVICE_EXE%
    
    cd %SERVICE_HOME%
    
    echo installing AutoSend Service...
    installutil /i %SERVICE_EXE%
    
    :START THE SERVICE:
    SC \\targetServer ClearTracAutoSend
    
    pause
    

    这可能不是远程的最佳解决方案,我不知道如何远程运行 installutil。我们 RDP 到服务器并运行批处理文件。

    【讨论】:

    • 我正在从我的本地计算机运行我当前的 xcopy 批处理文件,并将更新从我的计算机推送到许多服务器。我想避免从服务器本身运行任何东西。
    • 您可以使用sc 代替net stop 来启动/停止远程机器上的服务。
    • 这意味着运行批处理文件的用户需要权限才能停止服务器上的服务,对吧?所以我需要一个活动目录帐户?
    • 如何远程运行 installutil?这可能吗?
    【解决方案2】:

    如何将更新代码从服务中移出,该服务只是检查下一次迭代的时间到它自己的程序集中。在每次运行之前动态加载它,然后卸载它。我也想知道Quartz.net 是否对你有用。

    【讨论】:

      【解决方案3】:

      你可以让你的服务产生一个子进程(exe)并等待它退出。

      通过这种方式,您的应用程序可以轻松更新,因为它已加载、运行然后退出,并且只要您不需要更新服务,这一切都很容易。

      如果想要更棘手,您可以将其设置为程序集(dll),即通过将 dll 加载到内存中然后执行它来加载内存,或者您可以设置运行它的 ShadowCopy 目录。

      【讨论】:

        【解决方案4】:

        如果您愿意停止服务、推送代码和启动服务,您有几个选择。

        最好的是 Powershell 或 MsBuild。

        如果您关心时间,只需将服务设置为在启动时运行一次(或 startTime + 某个时间间隔),然后每小时运行一次。

        如果您确实需要此服务以保持运行但能够在运行之间更改代码,您将需要一些 Managed Extensibility Framework (MEF),它允许将 DLL 代码存储在某处并仅在运行时加载,因此无需重新启动即可修改。

        【讨论】:

          【解决方案5】:

          我最终使用了一些 @Decker97 的解决方案,并结合了一些 powershell 魔法:)

          function global:new-process()
          {
              param ([string]$computer, [string]$commandline=$(throw "Command line required."))
          
              $path = "\\$computer\root\cimv2:Win32_Process"
              $mc = new-object System.Management.ManagementClass $path
          
              $cmdargs = $commandline,$null,$null,0
          
              $ret = $mc.InvokeMethod("Create", $cmdargs)
              if ($ret -eq 0) {
                  write-host "Created Process ID: $($cmdargs[3])"
              }
              else {
                  write-host "Error $ret creating process."
              }
          
              $mc.Dispose()
          }
          
          $serverNames = Get-Content C:\temp\servers.txt
          
          foreach ($server in $serverNames) 
          {   
              write-host Updating $server
          
              c:\windows\system32\sc.exe \\$server STOP Service
          
              $source = "C:\Projects\Service\bin\Debug"
              $dest = "\\" + $server + "\C$\Program Files\TargetFolder\TargetFolder"
              ROBOCOPY.exe $source $dest /MIR /W:5 /R:1
          
              new-process $server 'c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Installutil.exe /i  /LogFile=install.out "C:\Program Files\TargetFolder\TargetFolder\serviceExecutable.exe"'
          
              c:\windows\system32\sc.exe  \\$server START Service
          }
          

          脚本使用服务控制来尝试停止服务。

          然后它使用 robocopy 将文件复制到服务器。

          然后使用 WMI 和 Powershell 在服务器上远程调用“installutil”。

          然后使用服务控制启动服务。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-04
            • 2017-07-22
            • 2017-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-05
            • 2019-01-08
            相关资源
            最近更新 更多