我正在尝试使用 TclDevKit 的 TclServiceManager 在我的 Windows 机器上安装 Tcl 程序作为服务。我正在一步一步地遵循这里的指南,但我遇到了很多问题。
如果我尝试使用我的原始 .tcl 文件来创建服务,我会收到以下错误:
Error 1053: The service did not respond to the start or control request in a timely fashion.
我在此处遵循了此问题的解决方案,以便在服务控制管理器终止程序之前有更多时间启动程序;无济于事。
然后我决定尝试使用 TclApp 包装程序,看看是否有效。正如指南所说,我使用了base-tclsvc-win32-ix86.exe
位于我的 TclDevKit bin 目录中的前缀文件。以这种方式安装服务,然后尝试运行它会导致以下错误:
Windows could not start the <service name> service on Local Computer.
Error 1067: The process terminated unexpectedly.
根本没有太多信息可以让我在谷歌上搜索这个错误。唯一的 Stackoverflow 帖子就是这个。所以我尝试通过命令提示符手动安装服务<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 获取它们,这两个程序都可以工作,但如果您尝试将它们分别作为解包和打包的服务运行,则会出现上述错误。
有任何想法吗?