我尝试使用TclDevKit的TclServiceManager在我的Windows机器上安装Tcl程序作为服务。我一步一步地遵循指南here,但我遇到了很多问题。
如果我尝试使用我的原始.tcl文件来创建服务,我会收到以下错误:
Error 1053: The service did not respond to the start or control request in a timely fashion.
我已经按照此问题here的解决方案为程序提供了更多时间在服务控制管理器终止之前启动;无济于事。
然后我决定尝试使用TclApp包装程序,看看是否有效。与指南一样,我使用了位于我的TclDevKit bin目录中的base-tclsvc-win32-ix86.exe
前缀文件。以这种方式安装服务,然后尝试运行它会导致以下错误:
Windows could not start the <service name> service on Local Computer.
Error 1067: The process terminated unexpectedly.
根本没有太多信息我可以通过谷歌搜索这个错误。它上面唯一的Stackoverflow帖子是this一个。所以我尝试使用<TheProgram>.exe <Service Name> -install
通过命令提示符手动安装服务并尝试运行它 - 仍然给了我同样的错误。
然后我尝试通过运行<TheProgram>.exe <Service Name> -debug
来查看是否可以获得任何有用的信息,有趣的是我得到了以下输出:
Debugging <Service Name>.
InitTypes: failed to find the DictUpdateInfo AuxData type
abnormal program termination
谷歌搜索InitTypes: failed to find the DictUpdateInfo AuxData type
导致我无处可去,但它似乎与Tcl有关。
最后,如果它意味着什么,我试图作为服务安装的程序的源代码是一些简单的Web服务器代码:
proc Serve {chan addr port} {
fconfigure $chan -translation auto -buffering line
set line [gets $chan]
set path [file join . [string trimleft [lindex $line 1] /]]
if {$path == "."} {set path ./index.html}
if {[catch {
set f1 [open $path]
} err]} {
puts $chan "HTTP/1.0 404 Not Found"
} else {
puts $chan "HTTP/1.0 200 OK"
puts $chan "Content-Type: text/html"
puts $chan ""
puts $chan [read $f1]
close $f1
}
close $chan
}
if {![info exists reload]} {
set sk [socket -server Serve 3000]
puts "Server listening on port 3000"
vwait forever
} else {
unset reload
}
要检查并查看源代码是否存在问题,我尝试了另一个更简单的示例,它只是在特定目录中创建了一个文件:
set filePath "C:/some/path/here";
set fileName "Test.txt";
set file [open [file join $filePath $fileName] w];
puts $file "Hello, World";
close $file;
如果您只是从tclsh86.exe中获取它们,那么这两个程序都可以工作,但如果您尝试将它们分别作为解包和包装的服务运行,则会出现上述错误。
有什么想法吗?