TclDevKit の TclServiceManager を使用して、Tcl プログラムをサービスとして Windows マシンにインストールしようとしています。ここのガイドを順を追って実行していますが、多くの問題が発生しています。
生の .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 からソースを取得するだけで機能しますが、ラップされていないサービスとラップされているサービスとしてそれぞれ実行しようとすると、上記のエラーが発生します。
何か案は?