কীভাবে উইন্ডোজ পরিষেবা প্রোগ্রামক্রমে নিজেকে পুনরায় চালু করতে পারে?


135

নিজেকে পুনরায় আরম্ভ করার জন্য উইন্ডোজ পরিষেবা (সার্ভার 2003) সক্ষম করতে আমাকে .NET- তে দৃust় কোড লিখতে হবে। এটির সর্বোত্তম উপায় কী? এটি করার জন্য কিছু .NET এপিআই আছে?


7
"রোবস্ট" একটি নয়েজ শব্দ ( স্ট্যাকওভারফ্লো.ফগবগজ.com / ডেফল্ট.এএসপি? ডাব্লু 013086 ) - আপনার কোন নির্দিষ্ট বৈশিষ্ট্যের প্রয়োজন?
আইদন রায়ান

উত্তর:


187

ব্যর্থতার পরে পরিষেবাটি পুনরায় চালু করতে সেট করুন (কন্ট্রোল প্যানেলে পরিষেবাটি ডাবল ক্লিক করুন এবং সেই ট্যাবগুলিতে ঘুরে দেখুন - আমি এর নামটি ভুলে যাই)। তারপরে, আপনি যে কোনও সময় পরিষেবাটি পুনঃসূচনা করতে চান, কেবল কল করুন Environment.Exit(1)(বা কোনও শূন্য নয় এমন রিটার্ন) এবং ওএস আপনার জন্য এটি পুনরায় চালু করবে।


7
Fyi অবস্থান পরিষেবা প্যানেলে রয়েছে, প্রশ্নে পরিষেবাটিতে ডান ক্লিক করুন এবং বৈশিষ্ট্যগুলি নির্বাচন করুন, তারপরে পুনরুদ্ধার ট্যাবটি চয়ন করুন।
জেমস মাইকেল হরে 14

20
আমি দেখতে পাচ্ছি এটি কীভাবে পছন্দসই আচরণ অর্জন করে তবে 1 এর একটি রিটারকোড বোঝানো হয়েছে যাতে সিস্টেমটি ত্রুটি হয়েছিল tell আসলে যদি কোনও ত্রুটি না ঘটে এবং আপনি কেবল আপনার পরিষেবাটি পুনরায় চালু করতে চেয়েছিলেন তবে কি এই খারাপ অভ্যাসটি নয়?
মিগগল্টিংগার

4
এটি ইনস্টল ইভেন্টের পরে সার্ভিস ইনস্টলার দ্বারা প্রোগ্রামেটিক্যালি করা যেতে পারে, চারপাশে ক্লিক করার দরকার নেই ... যদি আপনার পরিষেবাটি কোনও রিমোট সার্ভারে থাকে এবং আপনাকে দিনের মধ্যে বেশ কয়েকবার এটি ইনস্টল করতে হবে, উদাহরণস্বরূপ পরীক্ষার সময়?
ডিন কুগা

5
@ এমজিটিলিংগার: আমি মনে করি যে হ্যাঁ, একটি খারাপ অভ্যাস যখন আপনার পরিষেবা স্বাস্থ্যকর থাকে, তাই এটি আর পুনরায় আরম্ভ করার দরকার হবে না। তবে কিছু পরিষেবা আর্কিটেকচার আমাদের নাগালের বাইরে এবং যদি তাদের পুনঃসূচনা করার দরকার হয় তবে এটি একটি লক্ষণ যা এটি ভাল নয়, সুতরাং কিছু ন্যূনতম রিসোর্সগুলি বন্ধ করতে এবং মুক্ত করতে কোনও সমস্যা নেই (যদি সম্ভব হয়) এবং 'তাদের পা কেটে ফেলুন', কারণ পরিষেবাটি অনুপযুক্তভাবে চালানো খারাপ হতে পারে (অকেজো)।
লুসিয়ানো

5
@ জনলিডগ্রেন যদি আপনি একটি উপযুক্ত শাটডাউন চান তবে আপনি সার্ভিস রিকভারি সেটিংস স্ক্রিনে চেকবক্সটি 'ত্রুটিগুলি সহ স্টপগুলির জন্য ক্রিয়াগুলি সক্ষম করুন` সক্ষম করার সাথে সাথে সেট করতে পারেন Service.ExitCode = 1এবং কার্যকর করতে পারেন Service.Stop()। এইভাবে এটি করা একটি উপযুক্ত শাটডাউন করার অনুমতি দেয় এবং এখনও পুনঃসূচনাটি ট্রিগার করে।
ক্রিস রাইস

22
Dim proc As New Process()
Dim psi As New ProcessStartInfo()

psi.CreateNoWindow = True
psi.FileName = "cmd.exe"
psi.Arguments = "/C net stop YOURSERVICENAMEHERE && net start YOURSERVICENAMEHERE"
psi.LoadUserProfile = False
psi.UseShellExecute = False
psi.WindowStyle = ProcessWindowStyle.Hidden
proc.StartInfo = psi
proc.Start()

3
আপনার চারপাশের পরিষেবার নাম যুক্ত করতে ভুলবেন না যদি এতে স্পেস থাকে।
এপিসি

4
এটি কেবল সুবিধাভোগী অ্যাকাউন্টের অধীনে চলমান পরিষেবাদির জন্য, যা যাইহোক খারাপ ধারণা।
দিমিত্রি গুসরভ

17

আপনি নিশ্চিত হতে পারবেন না যে আপনার অ্যাকাউন্টের অধীনে যে ব্যবহারকারীর অ্যাকাউন্ট চলছে তার পরিষেবা বন্ধ এবং পুনঃসূচনা করার এমনকি অনুমতি রয়েছে।


যদিও +1-এড হিসাবে আমি একই সমস্যার মুখোমুখি হয়েছিলাম, sc.exe দেখার সময় দেখা যায় যে ওপেনসিসি ম্যানেজারকে কল করার সময় dwDesidedAccess হিসাবে SERVICE_QUERY_CONFIG ব্যবহার করে এবং তারপরে SERVICE_START এর সাথে ওপেন সার্ভিস () কল করে | একটি নির্দিষ্ট পরিষেবা খোলার জন্য SERVICE_STOP এবং এটি ঠিক কাজ করে (অ্যাক্সেস নিয়ে কোনও সমস্যা নেই)। কীভাবে এটি নেট এ করা যায় তা সম্পর্কে নিশ্চিত নন।
n0p

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

@ সুইচ এর একটি বিশাল পরিসেবা আছে যা নেটওয়ার্ক সার্ভিসের অধীনে পরিচালিত হয়, যা ডিফল্টরূপে তার নিজস্ব নির্বাহযোগ্য খোলারও অধিকার নেই।
এজেন্টফায়ার

@ এজেন্টফায়ার, সঠিক, তবে ডিফল্ট স্থানীয় সিস্টেম, নেট সার্ভিস নয়। স্থানীয় সিস্টেম অপারেটিং সিস্টেমের মধ্যে সহজাতভাবে সর্বোচ্চ স্তরের সুবিধাগুলি রয়েছে - স্থানীয় প্রশাসক গোষ্ঠীর সদস্যদের অর্পণ করা ছাড়িয়ে।
স্যুইচ করুন

@ সুইচ তবে সর্বাধিক উপলভ্য সুবিধাগুলি ব্যবহার করা পিওএল-নীতি লঙ্ঘন করছে ।
এজেন্টফায়ার

12

আপনি একটি প্রক্রিয়া তৈরি করতে পারেন যা ডস কমান্ড প্রম্পট যা নিজেকে পুনরায় আরম্ভ করে:

 Process process = new Process();
 process.StartInfo.FileName = "cmd";
 process.StartInfo.Arguments = "/c net stop \"servicename\" & net start \"servicename\"";
 process.Start();

এটি, অন্য কিছু না করে কলিং থ্রেডের সুরক্ষা প্রসঙ্গে উত্তরাধিকারী হবে ... এবং যতক্ষণ না এটি এমন একটি প্রসঙ্গ যা পুনরায় চালু করার জন্য পর্যাপ্ত অশ্বশক্তি রয়েছে ততক্ষণ আপনি ভাল।
ক্লে

12
const string strCmdText = "/C net stop \"SERVICENAME\"&net start \"SERVICENAME\"";
Process.Start("CMD.exe", strCmdText);

SERVICENAMEআপনার পরিষেবার নাম কোথায় (পরিষেবা নামের জায়গাগুলির জন্য অ্যাকাউন্টে অন্তর্ভুক্ত ডাবল উক্তিগুলি অন্যথায় বাদ দেওয়া যেতে পারে)।

পরিষ্কার, কোনও স্বয়ং-পুনঃসূচনা কনফিগারেশন প্রয়োজন।


9
& বনাম && সম্পর্কে: নতুন কিছু শিখেছে: [কমান্ড 1] এবং [কমান্ড 2] সর্বদা উভয় কমান্ডকে যথাক্রমে সম্পাদন করবে, যখন [কমান্ড 1] && [কমান্ড 2] কেবলমাত্র কমান্ড 1 সফলভাবে চালিত হলে ( স্বয়ংক্রিয়াস্ত্র.com / forum / topic/… )
জেফ্রি নাইট

5

আপনি কেন এটি পুনরায় আরম্ভ করতে চান এটি তার উপর নির্ভর করবে।

আপনি যদি সময়ে সময়ে পরিষেবাটি নিজেকে পরিষ্কার করার জন্য কেবল সন্ধান করে থাকেন তবে আপনার পরিষেবাতে একটি টাইমার চলতে পারে যা পর্যায়ক্রমে খাঁটি রুটিনের কারণ হয়ে দাঁড়ায়।

আপনি যদি ব্যর্থতা পুনরায় চালু করার কোনও উপায় সন্ধান করছেন - পরিষেবা হোস্ট নিজেই সেটআপ করার সময় সেই ক্ষমতাটি সরবরাহ করতে পারে।

তাহলে কেন আপনাকে সার্ভারটি পুনরায় চালু করতে হবে? আপনি কি অর্জন করার চেষ্টা করছেন?


1
আপনি যদি বড় অবজেক্ট হিপ এবং মেমরি বিভাজন নিয়ে উদ্বিগ্ন হন তবে এটি কাজ করবে না। অনুমানভাবে। নেট 4 / 4.5 এবং 64-বিট প্রক্রিয়াগুলি এতে অনেক সহায়তা করেছে।
ডেভিড কাসা

3

আমি মনে করি না আপনি কোনও স্বনির্ভর পরিষেবাতে পারবেন (যখন আপনি পুনঃসূচনা বলবেন তখন এটি পরিষেবাটি বন্ধ হয়ে যাবে, যা পুনঃসূচনা কমান্ডকে বাধাগ্রস্ত করবে, এবং এটি আর আর শুরু হবে না)। আপনি যদি দ্বিতীয় .exe (সার্ভিস ম্যানেজার শ্রেণি ব্যবহার করে এমন একটি কনসোল অ্যাপ্লিকেশন) যুক্ত করতে পারেন, তবে আপনি স্ট্যান্ডেলোন .exe বন্ধ করে পরিষেবাটি পুনরায় চালু করতে এবং তারপরে প্রস্থান করতে পারেন।

দ্বিতীয় চিন্তায়, আপনি সম্ভবত পরিষেবাটি সূচনা করার জন্য একটি নির্ধারিত টাস্কটি রেজিস্টার করতে পারেন (উদাহরণস্বরূপ 'কমান্ড-লাইন' at 'কমান্ড ব্যবহার করে) পরিষেবাটি শুরু করার জন্য এবং তারপরে এটি নিজেই বন্ধ হয়ে যেতে পারে; এটা সম্ভবত কাজ করবে।


3

ব্যাচ ফাইল বা EXE এ শেলিংয়ের সমস্যাটি হ'ল কোনও পরিষেবাটির বাহ্যিক অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজনীয় অনুমতি থাকতে পারে এবং নাও থাকতে পারে।

এটি খুঁজে পাওয়ার সবচেয়ে পরিষ্কার উপায়টি হ'ল অনসটপ () পদ্ধতিটি ব্যবহার করা, যা পরিষেবা নিয়ন্ত্রণ ব্যবস্থাপকের জন্য প্রবেশের পয়েন্ট। তারপরে আপনার সমস্ত ক্লিনআপ কোডটি চলবে এবং আপনার স্টপ কোডটি কাজ করছে তা ধরে নিয়ে কোনও ঝুলন্ত সকেট বা অন্যান্য প্রক্রিয়া থাকবে না।

এটি করার জন্য আপনাকে সমাপ্তির আগে একটি পতাকা সেট করতে হবে যা একটি ত্রুটি কোড সহ প্রস্থান করতে অনস্পট পদ্ধতিটিকে বলে; তারপরে এসসিএম জানে যে পরিষেবাটি পুনরায় চালু করা দরকার। এই পতাকা ছাড়া আপনি এসসিএম থেকে ম্যানুয়ালি পরিষেবাটি থামাতে পারবেন না। এটি ধরেও নিয়েছে যে কোনও ত্রুটি পুনরায় চালু করার জন্য আপনি পরিষেবাটি সেট আপ করেছেন।

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

...

bool ABORT;

protected override void OnStop()
{
    Logger.log("Stopping service");
    WorkThreadRun = false;
    WorkThread.Join();
    Logger.stop();
    // if there was a problem, set an exit error code
    // so the service manager will restart this
    if(ABORT)Environment.Exit(1);
}

যদি পরিষেবাটি কোনও সমস্যা হয়ে যায় এবং পুনরায় আরম্ভ করার প্রয়োজন হয়, আমি একটি থ্রেড চালু করি যা এসসিএম থেকে পরিষেবাটি বন্ধ করে দেয়। এটি পরিষেবাটি নিজের পরে পরিষ্কার করার অনুমতি দেয়:

...

if(NeedToRestart)
{
    ABORT = true;
    new Thread(RestartThread).Start();
}

void RestartThread()
{
    ServiceController sc = new ServiceController(ServiceName);
    try
    {
        sc.Stop();
    }
    catch (Exception) { }
}

2

আমি আপনার পরিষেবার পুনরায় আরম্ভের সময়সূচী করতে উইন্ডোজ শিডিউলারটি ব্যবহার করব। সমস্যাটি হ'ল আপনি নিজেকে পুনরায় আরম্ভ করতে পারবেন না তবে আপনি নিজেকে আটকাতে পারবেন। (আপনি যে শাখায় বসেছেন সেই শাখাটি আপনি মুছে ফেলেছেন ... আপনি যদি আমার সাদৃশ্য পান) আপনার জন্য এটি করার জন্য আপনার একটি পৃথক প্রক্রিয়া প্রয়োজন। উইন্ডোজ সিডিউলার একটি উপযুক্ত। তাত্ক্ষণিকভাবে সম্পাদন করতে আপনার পরিষেবা পুনরায় চালু করতে (এমনকি পরিষেবার মধ্যে থেকেই) একটি সময় কাজ নির্ধারণ করুন।

অন্যথায়, আপনাকে একটি "রাখাল" প্রক্রিয়া তৈরি করতে হবে যা এটি আপনার জন্য করে।


2

প্রশ্নের প্রথম প্রতিক্রিয়া হ'ল সহজ সমাধান: "পরিবেশ.এক্সিট (1)" আমি এটি উইন্ডোজ সার্ভার ২০০৮ আর 2 এ ব্যবহার করছি এবং এটি পুরোপুরি কার্যকরভাবে কাজ করে। পরিষেবাটি নিজেই বন্ধ হয়ে যায়, ও / এস 1 মিনিট অপেক্ষা করে, তারপরে এটি পুনরায় চালু করে।


এটি কতক্ষণ অপেক্ষা করে তা নির্ভর করে আপনি কতক্ষণ অপেক্ষা করতে সেট আপ করেছেন তার উপর। ডিফল্ট যদিও 1 মিনিট, তবে কেউ যদি না চান তবে আপনার উত্তরটি ভুল ধারণা দেয়।
এস্পেন

1

আমি এটা করতে পারি না। যখন কোনও পরিষেবা "থামানো" হয়, এটি সম্পূর্ণভাবে লোড হয়।

ঠিক আছে, ঠিক আছে, আমি মনে করি একটি উপায় আছে। উদাহরণস্বরূপ, আপনি পরিষেবাটি বন্ধ করতে একটি বিচ্ছিন্ন প্রক্রিয়া তৈরি করতে পারেন, তারপরে এটি পুনরায় চালু করুন, তারপরে প্রস্থান করুন।


0

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

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


0

কেবল পাস হচ্ছে: এবং ভেবেছিলাম আমি কিছু অতিরিক্ত তথ্য যুক্ত করব ...

আপনি একটি ব্যতিক্রমও ছুঁড়ে দিতে পারেন, এটি উইন্ডো পরিষেবাটি স্বয়ংক্রিয়ভাবে বন্ধ করে দেবে, এবং অটো পুনরায় আরম্ভের বিকল্পগুলি কেবলমাত্র কিক ইন করবে with এর সাথে একমাত্র সমস্যাটি হ'ল যদি আপনার পিসিতে কোনও দেব-পরিবেশ থাকে তবে জেআইটি ভিতরে প্রবেশের চেষ্টা করে, এবং আপনি ডিবাগ ওয়াই / এন বলে একটি প্রম্পট পাবেন। না বলুন এবং তারপরে এটি বন্ধ হবে এবং তারপরে সঠিকভাবে পুনরায় শুরু করুন। (কোনও জেআইটিবিহীন পিসিতে এটি সমস্ত কাজ করে)। ইম ট্রলিংয়ের কারণ, এই জেআইটি কি উইন to-তে নতুন (এটি এক্সপি ইত্যাদির সাথে সূক্ষ্মভাবে কাজ করত) এবং আমি জেআইটি নিষ্ক্রিয় করার একটি উপায় অনুসন্ধান করার চেষ্টা করছি .... আমি পরিবেশের চেষ্টা করতে পারি hereএছাড়াও বর্ণিত পদ্ধতিটি এখানে দেখুন কীভাবে দেখুন যে খুব কাজ করে।

ক্রিস্টিয়ান: ব্রিস্টল, যুক্তরাজ্য


3
এই সমস্ত ছোঁড়া ব্যতিক্রম, প্রস্থান (1) সমাধানগুলি সমস্তই কোনও অ্যাপ্লিকেশনটির সঠিক সাফাই এড়ায় avoid অ-
করুণাপূর্ণভাবে

0

এইভাবে একটি পুনঃসূচনা.ব্যাট ফাইল তৈরি করুন

@echo on
set once="C:\Program Files\MyService\once.bat"
set taskname=Restart_MyService
set service=MyService
echo rem %time% >%once%
echo net stop %service% >>%once%
echo net start %service% >>%once%
echo del %once% >>%once%

schtasks /create /ru "System" /tn %taskname% /tr '%once%' /sc onstart /F /V1 /Z
schtasks /run /tn %taskname%

তারপরে আপনার% পরিষেবা% শুরু হওয়ার সাথে সাথে টাস্ক% টাস্কনাম% মুছুন


0

অ্যাপ্লিকেশন কোডটি হোস্ট করার জন্য একটি পৃথক অ্যাপডোমেন তৈরি করুন। যখন পুনঃসূচনা দরকার তখন আমরা অ্যাপডোমেনটি প্রক্রিয়া (উইন্ডোজ পরিষেবা) এর পরিবর্তে আনলোড এবং পুনরায় লোড করতে পারি। আইআইএস অ্যাপ পুলটি এভাবেই কাজ করে, তারা সরাসরি এসপ নেট অ্যাপটি চালায় না, তারা পৃথক অ্যাপডমিন ব্যবহার করে।


-2

সবচেয়ে সহজ উপায় হল এর সাথে ব্যাচ ফাইল থাকা:

নেট স্টপ নেট শুরু

এবং আপনার পছন্দসই সময়ের ব্যবধানের সাথে ফাইলটি শিডিয়ুলারে যুক্ত করুন


এটি কাজ করছে না কারণ ব্যাচটি উভয় কমান্ডের মধ্যেই বন্ধ হয়ে গেছে, কারণ এটি সেবার নিজেই একটি শিশু প্রক্রিয়া।
ওরাব্যাগ

-3
private static void  RestartService(string serviceName)
    {
        using (var controller = new ServiceController(serviceName))
        {
            controller.Stop();
            int counter = 0;
            while (controller.Status != ServiceControllerStatus.Stopped)
            {
                Thread.Sleep(100);
                controller.Refresh();
                counter++;
                if (counter > 1000)
                {
                    throw new System.TimeoutException(string.Format("Could not stop service: {0}", Constants.Series6Service.WindowsServiceName));
                }
            }

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