Erlang、rebar3、およびWindowsでのサービスのインストール

ErlangリリースをWindowsでサービスとして機能させる方法。 なぜこれが行われるのかという疑問を舞台裏に残します。 時々必要なだけです。 それでは、HOWに注目しましょう。 さらに難しくするために、 wixtoolsetを使用してこれを行うタスクを設定します。


このメモは一種のチートシートです。 私はそれが決して便利にならないことを本当に願っていますが。 行こう


どういうわけかファイルを設定し、実行時間をもたらしたと想像してください。 コンソールの形でのアプリケーションの起動がトリガーされ、サービスの形でアプリケーションの起動を調整する必要があります。 この段階ですでに問題がある場合-私に書いて、私はちょうどその周りに刻印しました。


だから、ここで私たちはいくつかの楽しい落とし穴を待っています。 何らかの方法でNAME-APPLICATIONスクリプトを実行できます。 そして、それも機能します。 ただし、2つの欠点があります。黒い画面が跳ね上がり、アプリケーションが削除されてもサービスは削除されません。


不足しているものに移りましょう:


1)erts-NUMBER \ binディレクトリにあるerl.iniファイル。 インストール後、その内容にはリリースが収集されたマシンのパスが含まれます。 その内容を変更する必要があります。 そして、パスに二重スラッシュを入れる必要があります。
2)erlsrv.exeファイルを使用してサービスが開始されます。 これはランタイムの一部であり、すべてここで問題ありません。 忘れずに携帯してください。
3)erlsrv.exeは、releases \ VERSIONでstart.bootファイルを見つけることを想定しています。 しかし、彼はそこにいません。 そして、あなたはそれをコピーする必要があります


<DirectoryRef Id="_VERSION"> <Component Id="CopyBootFile" Guid="{GUID}"> <CopyFile Id="start.boot" FileId="APPNAME.boot" DestinationDirectory="_VERSION" DestinationName="start.boot" /> </Component> </DirectoryRef> 

4)erlsrv.exeは、サービスパラメータをレジスタに保存します。 そして、それらは私たち自身によって完成されなければなりません。


今の例


たとえば、奇跡のアプリケーションはerlang_serviceと呼ばれます。 レジスタに書き込みます:


 <RegistryKey Root="HKLM" Key="Software\Ericsson\Erlang\ErlSrv\1.1\erlang_service" > <RegistryValue Type="expandable" Name="Args" Value="-setcookie MY_COOKIE ++ -rootdir &quot;[ProgramFiles64Folder]ErlangService&quot;" /> <RegistryValue Type="string" Name="Comment" Value="Erlang node service" /> <RegistryValue Type="integer" Name="DebugType" Value="0" /> <RegistryValue Type="multiString" Name="Env" Value="" /> <RegistryValue Type="string" Name="InternalServiceName" Value="erlang_service" /> <RegistryValue Type="expandable" Name="Machine" Value="[ROOT]erts-9.2\bin\start_erl.exe" /> <RegistryValue Type="string" Name="Name" Value="" /> <RegistryValue Type="integer" Name="OnFail" Value="0" /> <RegistryValue Type="integer" Name="Priority" Value="32" /> <RegistryValue Type="string" Name="SName" Value="erlang_service" /> <RegistryValue Type="string" Name="StopAction" Value="init:stop()." /> <RegistryValue Type="expandable" Name="WorkDir" Value="[ROOT]" /> </RegistryKey> 

ここにこれがあります:


--rootdir-アプリケーションがインストールされる場所。 そうです。 たとえば、[ROOT]-ディレクトリ自体のIDを使用すると、最後にスラッシュがあるため、何も機能しません。 そしてそれは彼を混乱させます。
InternalServiceName値= "erlang_service"-この名前の下に、サービスを配置します。
SNameはアーランショートネームです
[ROOT]-ファイルが置かれているディレクトリのID。


さて、サービス自体:


 <ServiceInstall Id="ErlangService" Type="ownProcess" Vital="yes" Start="auto" Account="LocalSystem" ErrorControl="normal" Name="erlang_service" DisplayName="ErlangService" Description="erlang_service-[ProductVersion]" Interactive="no" > <ServiceDependency Id="LanmanWorkstation" /> <util:ServiceConfig FirstFailureActionType="restart" SecondFailureActionType="restart" ThirdFailureActionType="none" ResetPeriodInDays="1"/> </ServiceInstall> <ServiceControl Id="ErlangServiceControl" Start="install" Stop="uninstall" Remove="uninstall" Name="erlang_service" Wait="yes" /> 

その結果、自動的にインストールされ、停止され、正しく削除されるサービスがあります。


それだけです



Source: https://habr.com/ru/post/J351734/


All Articles