我正在寻找关于我正在构建的这个小系统的整体架构的一些指导。
目前,我有一个通过xcopy部署(和更新)到一些服务器的应用程序。这可以很好地更新代码,但不能很好地更新代码的执行周期,因为它被设置为windows计划任务,每小时运行一次。xcopy替换运行得很好,因为我可以从本地计算机运行更新,并将新的exe文件推送到所有服务器。在接下来的一个小时,任务调度程序将运行新的exe。
我想把它改成这样工作。
我的应用程序作为Windows Service运行,并使用System.Threading.Timer等待给定的持续时间,然后执行代码。这样,进程的一部分可以检查数据库,并在必要时减少给定服务器的执行周期。
这里的问题是,由于.exe将作为服务运行,它不允许通过xcopy轻松升级,因为该文件将一直在使用。
有什么想法我应该如何设置,以便能够进行简单的xcopy更新,同时作为一个windows服务运行?这有可能吗?
发布于 2010-07-27 14:53:40
我最终使用了一点@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“。
然后使用服务控制来启动服务。
发布于 2010-07-12 22:23:54
您可以停止服务,然后复制文件,然后从批处理文件启动服务:
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连接到服务器并运行批处理文件。
发布于 2010-07-12 22:35:04
如何将更新代码移出服务,简单地检查下一次迭代的时间到它自己的程序集中。在每次运行之前动态加载它,然后卸载它。我还想知道Quartz.net对您是否有用。
https://stackoverflow.com/questions/3232711
复制相似问题