通常、このエラーが発生します:(ローカルコンピューターの「サービス名」サービスが開始してから停止します。他のサービスまたはプログラムが使用していない場合、一部のサービスは自動的に停止します)ドライブパスなど。Windowsサービスは開始されません。
サイズ制限に達した場所にフォルダー/ファイルをバックアップするWindowsサービスがあります。詳細はすべて、Windowsサービスが開始時に読み取るXML構成によって提供されます。 Windowsサービスのonstartが実行していることを正確に実行するボタンを備えた個別のWindowsフォームがあります。 Windowsサービスに配置する前に、コードをデバッグするためにWindowsフォームを使用します。
Windowsフォームを起動すると。想定されることを行います。 WindowsサービスのOnStart()メソッドにコードを配置すると、エラーが表示されました。
これが私のコードです:
protected override void OnStart(string[] args)
{
private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";
protected override void OnStart(string[] args)
{
if (File.Exists(backupConfig))
{
FileSystemWatcher watcher = new FileSystemWatcher();
XmlTextReader reader = new XmlTextReader(backupConfig);
XmlNodeType type;
List<string> listFile = new List<string>();
string fileWatch = "";
//this loop is for reading XML elements and assigning to variables
while (reader.Read())
{
type = reader.NodeType;
if (type == XmlNodeType.Element)
{
if (reader.Name == "File")
{
reader.Read();
fileWatch = reader.Value;
}
else if (reader.Name == "Folder")
{
reader.Read();
fileWatch = reader.Value;
}
}
}
reader.Close();
watcher.Path = fileWatch;
watcher.Filter = "*.*";
//this loop reads whether the service will watch a file/folder
XmlTextReader reader1 = new XmlTextReader(backupConfig);
while (reader1.Read())
{
type = reader1.NodeType;
if (type == XmlNodeType.Element)
{
if (reader1.Name == "File")
{
watcher.IncludeSubdirectories = false;
watcher.Changed += new FileSystemEventHandler(OnChangedFile);
}
else if (reader1.Name == "Folder")
{
watcher.IncludeSubdirectories = true;
watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
}
}
}
reader1.Close();
watcher.EnableRaisingEvents = true;
}
else
{
StreamWriter sw = new StreamWriter(serviceStat, true);
sw.WriteLine("File not found. Please start the Log Backup UI first.");
sw.Close();
}
}
Windowsサービスが開始されない理由はわかりませんが、Windowsフォームシミュレーターは正常に機能しました。問題に見えるのは?
更新:多くの試行の後、フォルダディレクトリ(ファイルなし)のみを使用すると、Windowsサービスが機能しないことに気付きました。 fileWatch変数を特定のファイル(ディレクトリを含む)に置き換えたとき、Windowsサービスが開始されました。フォルダーの場所に戻すと、機能しませんでした。私が思うに、フォルダーの場所はファイルウォッチャーでは機能しません。
フォルダーの場所を監視する新しいWindowsサービスを作成しようとしたとき、それは機能しました。しかし、元のWindowsサービスで同じ場所を試しても、機能しませんでした!私は気になりました!新しいコード/関数を配置するたびに、新しいWindowsサービスを作成し、インストーラーをビルドする必要があるようです。この方法で、エラーが発生した場所を追跡できます。
サービスがそのように開始および停止する場合、コードが未処理の例外をスローしていることを意味します。これはデバッグが非常に困難ですが、いくつかのオプションがあります。
これが役立つかどうかはわかりませんが、サービスをデバッグするには、OnStartメソッドで常に以下を使用できます。
protected override void OnStart(string[] args)
{
System.Diagnostics.Debugger.Launch();
...
}
visual Studioをプロセスに接続して、デバッグ機能を向上させることができます。
これがお役に立てば幸いです
次のようにプログラムを変更するだけで、既存のwindowsサービスをconsoleに変換すると非常に便利です。この変更により、Visual Studioでデバッグするか、実行可能ファイルを通常どおり実行して、プログラムを実行できます。ただし、Windowsサービスとしても機能します。 それについてもブログに投稿しました
program.cs
class Program
{
static void Main()
{
var program = new YOUR_PROGRAM();
if (Environment.UserInteractive)
{
program.Start();
}
else
{
ServiceBase.Run(new ServiceBase[]
{
program
});
}
}
}
YOUR_PROGRAM.cs
[RunInstallerAttribute(true)]
public class YOUR_PROGRAM : ServiceBase
{
public YOUR_PROGRAM()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Start();
}
protected override void OnStop()
{
//Stop Logic Here
}
public void Start()
{
//Start Logic here
}
}
ローカルmahcineのアクセス制御リスト(ACL)にすべてのHTTPエンドポイントが登録されていることを確認してください
http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html
EventLog.Logは「アプリケーション」として設定する必要があります
一方、別の理由:誤って。configファイルを削除すると、同じエラーメッセージが表示されます。
"ローカルコンピュータ上のサービスが開始され、その後停止されました。一部のサービスは自動的に停止します..."
この場合、Windowsイベントログには、問題のあるサービスが開始されてから停止されたというログを除き、何も追加されませんでした。
サービスのCONFIGファイルが無効であることがわかりました。無効なCONFIGファイルを修正すると、問題が修正されました。
タイマーとティックイベントを使用してファイルをコピーします。
サービスの開始時に、時間を開始し、時間の間隔を指定します。
そのため、サービスは実行を続け、ontickファイルをコピーします。
お役に立てば幸いです。
私は同じ問題に出くわしました。私のサービスはXMLSをアップロード/受信し、エラーをイベントログに書き込みます。
イベントログにアクセスしたときに、フィルタリングを試みました。イベントログが破損したことを通知します。
イベントログをクリアし、すべてOKです。
初期化を単体テストすることもできますが、OnStart
メソッドにあるため、これはほぼ不可能です。初期化コードを別のクラスに移動して、テストするか、少なくともフォームテスターで再利用できるようにすることをお勧めします。
次に、ロギングを追加し( Log4Net などを使用)、詳細なロギングを追加して、ランタイムエラーの詳細を確認できるようにします。実行時エラーの例としては、AccessViolation
などがあります。特に、構成ファイルにアクセスするための十分な特権なしでサービスが実行されている場合です。
サービスを実行しているアカウントは、D:ドライブをマップしていない可能性があります(これらはユーザー固有です)。ディレクトリを共有してみて、backupConfig
で完全なUNCパスを使用してください。
タイプwatcher
のFileSystemWatcher
はローカル変数であり、OnStart
メソッドが実行されるとスコープ外になります。おそらくインスタンスまたはクラス変数として必要です。