首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构建应用程序以在服务器上定期执行任务

构建应用程序以在服务器上定期执行任务
EN

Stack Overflow用户
提问于 2010-07-13 06:16:30
回答 5查看 309关注 0票数 0

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

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

我想把它改成这样工作。

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

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

有什么想法我应该如何设置,以便能够进行简单的xcopy更新,同时作为一个windows服务运行?这有可能吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-27 22:53:40

我最终使用了一点@Decker97的解决方案,再加上一些powershell的魔力:)

代码语言:javascript
运行
复制
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“。

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

票数 0
EN

Stack Overflow用户

发布于 2010-07-13 06:23:54

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

代码语言:javascript
运行
复制
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连接到服务器并运行批处理文件。

票数 2
EN

Stack Overflow用户

发布于 2010-07-13 06:35:04

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3232711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档