结论先行:Windows系统层面做不到单个服务控制延迟时间(第三方方案可以实现),但可以控制全局服务延迟启动的时间,赋值的时候单位是毫秒,不是秒。
不改的话,默认延迟启动是120秒,考虑到系统启动有个过程且服务启动一般有depend,实际延迟启动的时间是大于120秒的。
看到了DelayedAutoStart和AutoStartDelay有关的很多文档,没有一篇是正确的
有的说AutoStartDelay单位是毫秒,比如:
https://community.qlik.com/t5/Official-Support-Articles/Further-delay-Automatic-Delayed-Start-of-Services-to-prevent/ta-p/1717094
有的说AutoStartDelay单位是秒,比如:
https://social.technet.microsoft.com/Forums/en-US/d8f0e315-74d4-4890-a62f-ef427a8532e1/adjusting-the-autostart-delayed-start-time?forum=winservergen
https://knowledge.broadcom.com/external/article/29374/how-to-increase-the-default-delay-of-120.html
https://sevenitblog.com/2019/07/19/increase-a-service-time-automatic-delay-start-when-booting-a-windows-server/
有的说AutoStartDelay对2016/2019/2022不起作用,比如:
https://stackoverflow.com/questions/65861963/how-to-delay-the-start-of-a-specific-service-in-windows-services
结合本人实践,同步结论如下:
1、windows系统默认的延迟启动时间是120秒(考虑到服务启动有depend,实际延迟启动的时间是大于这个的)
Start then auto-delay service, the default delay is120 seconds, but it can be overridden by the creating an AutoStartDelay value in HKLMSYSTEMCurrentControlSetControl
2、延迟启动的全局配置项是HKLMSYSTEMCurrentControlSetControl下的AutoStartDelay(单位是毫秒,不是秒),无法在单个服务级别设置延迟时间,也就是说并不存在单个服务级别的AutoStartDelay
像下图这种是错误的
比如设置240秒延迟,需要按240000毫秒赋值,应该这样操作:
AutoStartDelay value in HKLMSYSTEMCurrentControlSetControl
Dword, could be 0 above
代码语言:javascript复制reg add "HKLMSYSTEMCurrentControlSetControl" /v "AutoStartDelay" /d 240000 /t REG_DWORD /f
3、对单个服务来说,AutoStartDelay生效的前提是DelayedAutoStart为1,如果DelayedAutoStart为0,即便你用sc.exe config servicename start= delayed-auto配置延迟启动也不起作用,因为DelayedAutoStart为0的情况下,重启机器后对应服务会变成start= auto。
DelayedAutoStart value in HKLMSYSTEMCurrentControlSetServices<servicename>
Dword, could be 0 or 1.
以上验证我专门整了非常方便的demo来观测,把下面的压缩包解压放到C盘根目录,然后执行下面的命令,然后重启机器等5分钟左右在C:addservice 目录看test.txt里5秒一次的时间戳,跟系统的启动时间做对比,执行如下powershell命令查看系统启动时间
13代表关机
6006代表系统日志停止记录
12代表开机
6005代表系统日志开始记录
powershell命令行执行如下代码查看系统启动时间:
代码语言:javascript复制Get-WinEvent -FilterHashtable @{logname='System';id=@(12,13,6005,6006,6008,41,1074);StartTime=(Get-Date).AddDays(-1) } | Where-Object {$_.ProviderName -eq "Microsoft-Windows-Kernel-General" -or $_.ProviderName -eq "User32" -or $_.ProviderName -eq "EventLog" } |Sort-Object -Property TimeCreated
cmd命令行执行如下代码添加服务:
代码语言:javascript复制sc.exe create demo binpath= "C:addservicesrvany.exe" start= auto displayname= "demo"
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v "AppEnvironment" /t reg_multi_sz /d "temp=C:Windowstemp; PATH=C:addservice;C:Windows;C:WindowsSystem32; " /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v AppDirectory /t REG_SZ /d "C:addservice" /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v Application /t REG_SZ /d "C:addservicedemo.exe" /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v AppParameters /t REG_SZ /d "" /f
sc.exe config demo depend= ""
sc.exe description demo "本软件作为服务置于后台时有个功能'每5秒钟打印一次时间戳'。这个Demo的作者特别棒,特意在title上写清了'我是WinForm,也是Windows服务'。demo.exe作为服务,会在demo.exe同目录下产生一个.txt文件,每5秒打印一下时间戳。demo.exe的代码参考:https://www.cnblogs.com/micro-chen/p/5885899.html、https://www.cnblogs.com/ldjbase/p/5405262.html。链接里第三个方案的下载压缩包里的srvany.exe才是ok的,这个srvany.exe是13KB,比8KB的srvany.exe更好一些。"
sc.exe config demo start= delayed-auto
reg add "HKLMSYSTEMCurrentControlSetControl" /v "AutoStartDelay" /d 240000 /t REG_DWORD /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemo" /v "DelayedAutoStart" /d 1 /t REG_DWORD /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemo" /v "AutoStartDelay" /d 60000 /t REG_DWORD /f
如下图,我配置的全局240秒,但给单个服务加的60秒(实际我前面说了,单个服务级别无法添加延迟时间,这里添加就是为了验证是否起作用),实测结果就是单个服务级别添加的延迟时间不起作用。
第三方方案控制单个程序延迟启动:http://www.rjlsoftware.com/software/utility/delayexec/
代码语言:javascript复制delayexec.exe "C:WindowsSystem32notepad.exe" 3
delayexec.exe "C:WindowsSystem32notepad.exe" 3 -max
delayexec.exe "C:WindowsSystem32notepad.exe" 3 -min
Example: delay.exe "C:Program FilesMicrosoft OfficeOfficeOUTLOOK.EXE" 60 -max
The example above would delay 60 seconds before launching Outlook, maximized.