私が見てきた限りでは、Windows のサービスは時々ちょっと変わっています。バックグラウンドで実行され、まるでミスター・インビジブルのように、通常は Windows の起動時に自動的に開始されます。ただし、実行可能ファイルから新しいサービスを作成することは、サービスとして設計されていない場合は特に、必ずしも簡単ではありません。アプリをサービスとして実行しようとしてエラー (典型的なエラー 1053 など) が発生した場合は、このガイドが回避策として役立ちます。sc.exe や New-Service などの組み込みツールの使用について説明していますが、アプリが頑固であったりあまりフレンドリーでない場合、NSSM などのサードパーティ ヘルパーを使用してそれらを動作させる方法についても説明しています。少し不格好ですが、実行可能です。結局のところ、非サービス バイナリをサービスとしてスムーズに実行するのは少し面倒ですが、適切なトリックを使用すれば、一日中アプリの面倒を見なくても、アプリをバックグラウンドで稼働させることができます。
Windows サービスを作成または管理する方法
方法 1: sc.exe を使用してサービスを素早く作成する
これは、コマンドライン制御による手軽なサービス作成に最適な方法です。シンプルな実行ファイルから引数をいくつか付けてサービスを起動し、スタートアップの種類をある程度制御したい場合に便利です。これは既にサービスとして設計されているアプリではうまく機能しますが、特にアプリがサービスとしての動作を想定して構築されていない場合は、エラーが発生することがあります。
コマンド プロンプト(管理者として実行)で実行する一般的なコマンドは次のとおりです。
sc create CorpCollectorService binPath= "C:\Program Files (x86)\CORP\collector.exe -i C:\tools\config.xml" start= auto DisplayName= "CORP Log Collector Service"
注意点:イコール記号の後にスペースを入れてください。Windowsはスペースを気にするからです。これを実行すると、すべてが順調に進んだ場合、確認メッセージが表示されます。
[SC] CreateService SUCCESS
次に、サービスパネル(services.msc)を確認し、F5更新ボタンを押してください。新しいサービスがリストに表示されるはずです。そこからサービスを開始、停止、または起動時の挙動を変更できます。
注意:アプリがサービスとして実行できるように構築されていない場合、起動時にエラーが発生したり、何も表示されずに失敗したりする可能性があります。アプリが制御信号を適切に処理できなかったり、応答が遅かったりすると、Windowsが不安定になり、エラー1053が発生することがあります。その場合は、追加のサポートや別のアプローチが必要になる場合があります。
方法2: PowerShellのNew-Serviceでサービスを作成する
これは少し現代的な方法です。特にスクリプトを作成している場合や、より高度な制御が必要な場合に便利です。PowerShellを使用すると、説明やスタートアップの種類などの詳細を一度に指定するのが少し簡単になります。ただし、繰り返しになりますが、この方法が本当に信頼できるのは、アプリがサービスとして実行されるように記述されている場合のみです。
基本的な例は次のとおりです。
New-Service -Name CorpCollectorService -BinaryPathName "C:\Program Files (x86)\CORP\collector.exe -i C:\tools\config.xml" -DisplayName "my test service" -Description "CORP Log Collector Service" -StartupType "Automatic"
特定のユーザー アカウントでサービスを実行する必要がある場合 (アクセス許可のためにこれを行う必要がある場合があります)、次のようにします。
$username = "user123" $password = "PaSSw0rd1" $securepassword = ConvertTo-SecureString $password -AsPlainText -Force $cred = New-Object System. Management. Automation. PSCredential ($username, $securepassword) New-Service...-Credential $cred
注:管理者権限でPowerShellを使用する必要があります。また、アカウントに適切な権限が付与されていること、およびパスワードが安全に処理されていることを確認する必要があります。実際には、有効な資格情報を使用しても、アプリ自体がサービス用に構築されていない場合、サービスが起動に失敗するという報告がユーザーから寄せられています。
オプション: 不要になったサービスを削除する
場合によっては、サービスを削除するだけで、問題を解決したり整理整頓したりするのが最も簡単な方法です。そのためには、次のコマンドを実行します。
sc delete service_name
service_name を実際のサービス名に置き換えてください。間違ったサービスを指定すると、重要な情報が失われる可能性があるため、ご注意ください。
サービスとして作られていないアプリを回避する(ハックだが便利なヒント)
ここからが少しややこしくなります。すべてのアプリがSCM(サービスコントロールマネージャー)の制御信号を処理できるわけではなく、起動/停止に正しく応答できないため、「エラー1053」のようなエラーが発生します。アプリがネイティブでサービスとして動作しない場合は、NSSM(Non-Sucking Service Manager)という便利なツールがあります。このツールを使うと、あらゆる実行ファイルをバックグラウンドでスムーズに実行できます。NSSMは仲介役のような存在で、アプリをサービスとして実行し、監視し、クラッシュ時には再起動まで行います。
インストールプロセスは非常に簡単です。まず、WinGet経由でNSSMをインストールします。
winget install --id NSSM. NSSM -e
次に、バイナリからサービスを作成するには、次のコマンドを実行します。
nssm install testservice "C:\Tools\collector.exe"
このように、NSSMは面倒な部分をすべて処理します。設定用のGUIも備えているため、コマンドラインを操作せずに起動パラメータ、環境変数、その他の設定を調整できます。後で設定やバイナリを更新する必要がある場合は、次のコマンドを実行してください。
nssm edit testservice
一部の設定では、サービスモードをネイティブにサポートしていないアプリでは、Microsoftの公式ツールが機能しない場合があります。他の方法がすべて機能しない場合は、NSSMが最適です。さらに、クラッシュしたアプリを自動的に再起動できるので、非常に助かります。
確かに、任意のアプリをサービスとして実行することは、必ずしも成功するとは限りません。特にグラフィカルアプリやインタラクティブアプリの場合はなおさらです。しかし、NSSMは、特にバックグラウンドで実行されるものや、常に実行する必要があるスクリプトの場合、プロセス全体の信頼性を大幅に向上させます。
正直、全体的にちょっと混乱してしまうこともありますが、これらのヒントを使えば大抵はそれほど手間をかけずに済むでしょう。アプリをバックグラウンドで活躍させるのがうまくいきますように!