লোকাল কম্পিউটারে উইন্ডোজ পরিষেবা শুরু হয়েছিল এবং তারপরে ত্রুটি বন্ধ হয়েছিল


104

সাধারণত, আমি এই ত্রুটিটি পেয়েছি: (লোকাল কম্পিউটারে "পরিষেবার নাম" পরিষেবাটি শুরু হয়ে গেছে এবং পরে বন্ধ হয়ে গেছে Some কিছু পরিষেবা অন্য পরিষেবাদি বা প্রোগ্রামগুলি ব্যবহার না করে তবে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়) যখন আমার কোডটিতে কোনও সমস্যা নেই যেমন অ-বিদ্যমান ড্রাইভ পাথ, ইত্যাদি। উইন্ডোজ পরিষেবা শুরু হবে না।

আমার কাছে একটি উইন্ডোজ পরিষেবা আছে যা আকারের সীমাতে পৌঁছে যদি কোনও স্থানে ফোল্ডার / ফাইলগুলিকে ব্যাক আপ করে। উইন্ডোজ পরিষেবা শুরুর পরে পড়া সমস্ত এক্সএমএল কনফিগারেশন দ্বারা বিশদগুলি সরবরাহ করা হয়। আমার একটি পৃথক উইন্ডোজ ফর্ম রয়েছে যার একটি বাটন রয়েছে যা আমার উইন্ডোজ পরিষেবাটির সূচনাটি ঠিক কি করছে। কোডটি আমার উইন্ডোজ পরিষেবাতে দেওয়ার আগে আমি আমার উইন্ডোজ ফর্মগুলি ডিবাগিংয়ের জন্য ব্যবহার করি।

আমি যখন আমার উইন্ডোজ ফর্মগুলি শুরু করি। এটি এটি করার জন্য যা মনে করে তা করে। আমি যখন আমার কোডগুলি উইন্ডোজ পরিষেবা অনস্টার্ট () পদ্ধতিতে রাখি তখন ত্রুটিটি প্রদর্শিত হয়েছিল।

আমার কোডটি এখানে:

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();
        }
    }

আমি জানি না কী উইন্ডোজ পরিষেবাটি চালু না রাখে, উইন্ডোজ ফর্ম সিমুলেটরটি ভাল কাজ করেছিল। কি সমস্যা হবে বলে মনে হয়?

আপডেট: অনেক পরীক্ষার পরে আমি লক্ষ্য করেছি যে কেবলমাত্র একটি ফোল্ডার ডিরেক্টরি (ডাব্লু / আউট ফাইল) ব্যবহার করে উইন্ডোজ পরিষেবাটি কাজ করে না। আমি যখন ফাইলওয়াচ ভেরিয়েবলটি নির্দিষ্ট ফাইলের (তার ডিরেক্টরি সহ) প্রতিস্থাপন করি তখন উইন্ডোজ পরিষেবা শুরু হয়। যখন আমি এটিকে আবার ফোল্ডারের লোকেশনে পরিবর্তন করেছি, এটি কার্যকর হয়নি। আমি যা মনে করি তা হ'ল ফোল্ডারের অবস্থানগুলি কোনও ফাইলওয়াতারে কাজ করে না।

যখন আমি একটি নতুন উইন্ডোজ পরিষেবা তৈরি করার চেষ্টা করেছি যা কোনও ফোল্ডারের অবস্থান দেখায়, এটি কাজ করে .. তবে, আমি যখন আমার আসল উইন্ডোজ পরিষেবাতে একই অবস্থানটি চেষ্টা করেছি তখন এটি কার্যকর হয়নি! আমি মনঃ $ # * এড ছিল! দেখে মনে হচ্ছে আমাকে নতুন উইন্ডোজ পরিষেবা তৈরি করতে হবে এবং প্রতিবারই আমি একটি নতুন কোড / ফাংশন রাখলে ইনস্টলারটি বানাতে হবে .. আমি যেখানে ত্রুটি পাই সেখানে ট্র্যাক রাখতে পারি।

উত্তর:


202

যদি পরিষেবাটি শুরু হয় এবং সেভাবে বন্ধ হয়ে যায়, এর অর্থ আপনার কোডটি একটি নিরস্ত্র ব্যতিক্রম নিক্ষেপ করছে। এটি ডিবাগ করা বেশ কঠিন, তবে কয়েকটি বিকল্প রয়েছে।

  1. উইন্ডোজ ইভেন্ট ভিউয়ারের সাথে পরামর্শ করুন । সাধারণত আপনি কম্পিউটার / সার্ভার ম্যানেজারের কাছে গিয়ে তারপরে ইভেন্ট ভিউয়ার -> উইন্ডোজ লগস -> অ্যাপ্লিকেশনটিতে ক্লিক করে এটি পেতে পারেন । আপনি ব্যতিক্রমগুলি এখানে ছুঁড়ে ফেলতে পারেন তা সাহায্য করতে পারে তবে আপনি স্ট্যাকের সন্ধান পাবেন না।
  2. একটি লাইব্রেরি ক্লাস প্রকল্পে আপনার প্রোগ্রামের যুক্তিটি বের করুন। এখন প্রোগ্রামটির দুটি ভিন্ন সংস্করণ তৈরি করুন: একটি কনসোল অ্যাপ (ডিবাগিংয়ের জন্য) এবং উইন্ডোজ পরিষেবা। (এটি প্রাথমিক প্রচেষ্টাটি কিছুটা হলেও দীর্ঘমেয়াদে প্রচুর অ্যাংস্ট বাঁচায়।)
  3. কী চলছে তার আরও ভাল চিত্র পেতে অ্যাপটিতে আরও চেষ্টা / ব্লক ধরুন এবং লগিং যুক্ত করুন।

10
উইন্ডোজ ইভেন্ট ভিউয়ার সম্পূর্ণ স্ট্যাক ট্রেস দেখিয়েছিল, খুব সহায়ক সরঞ্জাম।
তালহা ইমাম

37

এটি সহায়ক হবে তা নিশ্চিত নন, তবে কোনও পরিষেবা ডিবাগ করার জন্য আপনি সর্বদা নিম্নলিখিতটি স্টার্ট পদ্ধতিতে ব্যবহার করতে পারেন:

protected override void OnStart(string[] args)
{
     System.Diagnostics.Debugger.Launch();
     ...
}

প্রক্রিয়াটির সাথে আপনি আপনার ভিজ্যুয়াল স্টুডিও সংযুক্ত করতে পারেন এবং ডিবাগের আরও ভাল ক্ষমতা থাকতে পারেন।

আশা করি এটি সহায়ক ছিল, সৌভাগ্য


এটি এখন পর্যন্ত সেরা সমাধান (কমপক্ষে আমার জন্য)। ভিএস 2015 এটিকেও দুর্দান্তভাবে পরিচালনা করে। আমার জন্য এটি জেআইটি ডিবাগারের জন্য একটি ইউএসি কনফার্মেশন ডায়ালগ পপ করেছে এবং তারপরে আমাকে ডিবাগার হিসাবে ভিএস 2015 নির্বাচন করতে দিন।
স্মিটি

9

আমি এটা খুব আপনার বিদ্যমান রূপান্তর করতে কুশলী পাওয়া যায় উইন্ডোজ সেবা একটি থেকে কনসোল কেবল নিম্নলিখিত সঙ্গে আপনার প্রোগ্রাম পরিবর্তন করে। এই পরিবর্তনের মাধ্যমে আপনি ভিজ্যুয়াল স্টুডিওতে ডিবাগ করে বা সাধারনত সম্পাদনযোগ্য চালিয়ে প্রোগ্রাম চালাতে পারেন। তবে এটি উইন্ডোজ পরিষেবা হিসাবেও কাজ করবে। এটি সম্পর্কে একটি ব্লগ পোস্টও করেছি

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
    }
}


2

ইভেন্টলগ.লগকে "অ্যাপ্লিকেশন" হিসাবে সেট করা উচিত


আমি সবেমাত্র উত্সাহিত করেছি কারণ এটি আমার পক্ষে সমস্যার সমাধান ছিল
সেভেজ

1

এদিকে, আরেকটি কারণ: দুর্ঘটনাক্রমে .config ফাইলটি মুছে ফেলার কারণে একই ত্রুটির বার্তা উপস্থিত হয়েছে:

"স্থানীয় কম্পিউটারে পরিষেবা শুরু হয়ে যায় এবং তারপরে বন্ধ হয়ে যায় some কিছু পরিষেবা স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় ..."


0

আপনার ফাইলগুলি অনুলিপি করতে টাইমার এবং টিক ইভেন্টটি ব্যবহার করুন।

পরিষেবাটি চালু করার সময়, সময় শুরু করুন এবং সময়ের ব্যবধানটি নির্দিষ্ট করুন।

সুতরাং পরিষেবাটি চালিয়ে যাচ্ছে এবং অনটিক ফাইলগুলি অনুলিপি করছে।

আশা করি এটি সাহায্য করবে।


0

আপনি সূচনা পরীক্ষাটি ইউনিট করতে চাইতে পারেন - তবে এটি OnStartপদ্ধতিতে এটি অসম্ভবের কাছাকাছি। আমি সূচনা কোডটি আলাদা শ্রেণিতে স্থানান্তরিত করার পরামর্শ দেব যাতে এটি পরীক্ষা করা যায় বা কমপক্ষে কোনও ফর্ম পরীক্ষকটিতে পুনরায় ব্যবহার করা যায়।

দ্বিতীয়ত কিছু লগিং যুক্ত করুন (লগ 4 নেট বা অনুরূপ ব্যবহার করে ) এবং কিছু ভার্বোজ লগিং যুক্ত করুন যাতে আপনি রানটাইম ত্রুটিগুলি সম্পর্কে বিশদটি দেখতে পারেন। রানটাইম ত্রুটির উদাহরণগুলি AccessViolationহ'ল ইত্যাদি if


0

যে অ্যাকাউন্টটি পরিষেবাটি চালাচ্ছে তা ডি: -ড্রাইভ (তারা ব্যবহারকারী-নির্দিষ্ট) ম্যাপ করে না। ডিরেক্টরিটি ভাগ করে নেওয়ার চেষ্টা করুন এবং আপনার ইউএনসি-এর পুরো পথটি ব্যবহার করুন backupConfig

আপনার watcherটাইপটি FileSystemWatcherস্থানীয় পরিবর্তনশীল এবং OnStartপদ্ধতিটি সম্পন্ন হওয়ার পরে এটি সুযোগের বাইরে থাকে । আপনার সম্ভবত এটি উদাহরণ বা শ্রেণি ভেরিয়েবল হিসাবে প্রয়োজন।


0

আমি একই ইস্যু জুড়ে এসেছি। আমার পরিষেবাটি এক্সএমএলএস আপলোড / গ্রহণ করছে এবং ইভেন্ট লগটিতে ত্রুটিগুলি লিখছে।

আমি ইভেন্ট লগতে গেলে, আমি এটি ফিল্টার করার চেষ্টা করেছি। এটি আমাকে অনুরোধ করে যে ইভেন্ট লগটি দূষিত হয়েছিল।

আমি ইভেন্ট লগ এবং সমস্ত ঠিক আছে সাফ করেছি।


0

আমাদের ক্ষেত্রে, উইন্ডোজ ইভেন্ট লগগুলিতে সমস্যাযুক্ত পরিষেবা শুরু করা হয়েছে এবং তারপরে বন্ধ করা হয়েছে এমন লগ ব্যতীত আর কিছুই যুক্ত হয়নি।

দেখা যাচ্ছে যে পরিষেবাটির CONFIG ফাইলটি অবৈধ। অবৈধ CONFIG ফাইলটি সংশোধন করা সমস্যার সমাধান করেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.