2010-07-12 68 views
0

我正在尋找關於我正在構建的這個小系統的整體架構的一些指導。構建應用程序以定期在服務器上執行任務

目前,我有一個應用程序,通過xcopy部署(和更新)到幾個服務器。這適用於更新代碼,但它不適用於更新代碼執行的週期,因爲它設置爲每小時運行一次的Windows計劃任務。 xcopy替換效果很好,因爲我可以從本地機器運行更新,並將新的exe文件推送到所有服務器。接下來的一個小時,任務調度器將運行新的exe。

我想改變它以這種方式工作。

我的應用程序作爲Windows服務運行,並使用System.Threading.Timer等待給定的持續時間,然後執行代碼。這樣,進程的一部分可以檢查數據庫,並在必要時減少給定服務器的執行時間。

問題在那裏,是因爲.exe將作爲服務運行,它不會允許通過xcopy輕鬆更新,因爲該文件將始終處於使用狀態。

有關我應該如何設置這個以便能夠在作爲Windows服務運行時輕鬆執行xcopy更新的想法?這甚至可能嗎?

回答

0

最後我用了一下@ 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」。

然後使用服務控制來啓動服務。

2

您可以停止該服務,然後複製文件,然後開始從一個批處理文件服務:

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發送到服務器並運行批處理文件。

+0

我正在從本地機器運行我當前的xcopy批處理文件,並將更新從我的機器推送到許多服務器。我想避免從服務器本身運行任何東西。 – Nate 2010-07-12 22:28:07

+0

除了'net stop'外,您可以使用'sc'在遠程機器上啓動/停止服務。 – 2010-07-12 23:14:17

+0

這意味着運行批處理文件的用戶需要權限才能停止服務器上的服務,對不對?所以我需要一個活動目錄帳戶? – Nate 2010-07-13 03:11:54

0

你可以讓你的服務生成一個子進程(exe)並等待它退出。

通過這種方式,您的應用程序可以輕鬆更新,因爲它已加載,運行並退出,只要您不需要更新服務,這一切都非常簡單。

如果想要更加棘手,可以將其設置爲程序集(dll),即通過將內存加載到內存然後執行內存加載內存,或者您可以設置它運行的ShadowCopy目錄。

1

如何將更新代碼移出服務,只需將下一次迭代的時間檢查到自己的程序集中。在每次運行之前動態加載,然後卸載它。我也想知道Quartz.net對你有用。

0

如果您打算停止服務,推送代碼並啓動服務,您有幾個選項。

最好的應該是Powershell或MsBuild。

如果您關心計時,只需將服務設置爲在啓動時運行一次(或startTime +某個間隔),然後每小時運行一次。

如果你真的需要這個服務來保持運行,但是能夠改變運行之間的代碼,你需要一些Managed Extensibility Framework(MEF),它允許DLL代碼存儲在某個地方並且只在運行時加載,因此可以在不重啓的情況下進行修改。

相關問題