我有:
停止、卸载、复制、安装和启动 Windows 服务。
问题:它执行整个 list 两次。
尝试过:我已经修改了 waitInterval 和 waitAttempts 认为它超时并重新开始,但这并没有帮助。
问题:什么可能使它执行两次?
list :
<sitemanifest>
<runCommand path="net stop TestSvc"
waitInterval="240000"
waitAttempts="1"/>
<runCommand
path="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u
C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe"
waitInterval="240000"
waitAttempts="1"/>
<dirPath path="C:\msdeploy\TestSvc\TestSvc\bin\Debug" />
<runCommand
path="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe
C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe"
waitInterval="240000"
waitAttempts="1"/>
<runCommand path="net start TestSvc"
waitInterval="240000"
waitAttempts="1"/>
</sitemanifest>
发出的打包命令:
"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy"
-verb:sync
-source:manifest=c:\msdeploy\custom.xml
-dest:package=c:\msdeploy\package.zip
发出执行它的命令:
"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy"
-verb:sync
-source:package=c:\msdeploy\package.zip
-dest:auto,computername=<computerNameHere>
我作为域用户运行,该用户对框具有管理访问权限。我也尝试过传递凭据 - 这不是权限问题,命令成功,只是执行了两次。
编辑:
我启用了
-verbose
并在日志中发现了一些有趣的行:详细:执行同步传递 #1。
...
详细:源文件路径 (C:\msdeploy\MyTestWindowsService\MyTestWindowsService\bin\Debug\MyTestWindowsService.exe) 与目标 (C:\msdeploy\MyTestWindowsService\MyTestWindowsService\bin\Debug\MyTestWindowsService.exe) 不匹配,属性不同 (lastWriteTime[ '11/08/2011 23:40:30','11/08/2011 23:39:52'])。更新待定。
详细:源文件路径 (C:\msdeploy\MyTestWindowsService\MyTestWindowsService\bin\Debug\MyTestWindowsService.pdb) 与目标 (C:\msdeploy\MyTestWindowsService\MyTestWindowsService\bin\Debug\MyTestWindowsService.pdb) 不匹配,属性不同 (lastWriteTime[ '11/08/2011 23:40:30','11/08/2011 23:39:52'])。更新待定。
在这些行之后,文件不是第一次复制,而是第二次复制
...
详细:依赖项检查“DependencyCheckInUse”没有发现任何问题。
详细:收到来自代理的响应(HTTP 状态“OK”)。
详细:当前同步传递缺少 2 个对象的流内容。
详细:执行同步传递 #2。
...
高层
通常我会部署一个新构建的包,其中的位比服务器上的要新。
在第二遍期间,它复制第一遍中所做的一切。
在第 1 阶段,它将:
在第 2 阶段,它将:
我不知道为什么它不复制传递 1 中的文件,或者为什么触发传递 2。
如果我重新部署相同的包而不是部署新的位,它将运行第 1 阶段中的所有步骤,而不是运行第 2 阶段。可能是因为文件具有相同的时间戳。
最佳答案
问题中没有足够的信息来真正重现问题以给出具体答案......但是有几件事需要检查/更改/尝试使其工作:
waitInterval="240000"
和 waitAttempt="1"
(双引号代替单引号)-whatif
和 -verbose
选项编辑 - 添加后
-verbose
输出:我看到了这些可能性:
两台机器在时间上有差异(其中一台只是有点偏差或一些时区问题......)
如果文件系统之一是 FAT,这可能会导致问题(时间戳解析...)
编辑 2 - 根据评论:
在我的最后一次编辑中,我写了关于时间戳的内容,因为我怀疑比较这些时会出现问题……例如,这可能是两台机器之间的时钟不同(即使 30 秒的差异也会产生影响)和/或某些时区问题...
我写过关于文件系统的文章。 FAT,因为 FAT 的时间戳分辨率约为 2 秒,而 NTFS 具有更高的分辨率,这在比较时间戳时可能会再次产生影响......
根据您的描述,我建议以下解决方法:
preSync
and postSync
for the Service handling parts (i.e. preSync
for stop + uninstall and postSync
for install + start)并且只在 list 或命令行中进行纯同步或
runCommand
parts 编辑 3 - 根据 Merlyn Morgan-Graham 的评论,结果供将来引用:
使用
runCommand
时提供程序,使用批处理文件。出于某种原因,这使它停止运行两次传球。这个解决方案的问题是不能通过
SetParameters.xml
指定服务的安装目录。文件(对于 dontUseCommandExe
/preSync
/postSync
与 SetParameters.xml
相同)。编辑 4 - 根据 Merlyn Morgan-Graham 的评论:
超时参数适用于是否终止该特定命令,而不适用于关闭 Windows 服务本身......在这种情况下,Windows 服务似乎需要很长时间才能停止,因此只有
runCommand
s 在没有复制/同步的情况下执行,并且启动了整个运行的新尝试...
关于iis - MsDeploy 远程执行 list 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5408585/