নিজেকে পুনরায় আরম্ভ করার জন্য উইন্ডোজ পরিষেবা (সার্ভার 2003) সক্ষম করতে আমাকে .NET- তে দৃust় কোড লিখতে হবে। এটির সর্বোত্তম উপায় কী? এটি করার জন্য কিছু .NET এপিআই আছে?
নিজেকে পুনরায় আরম্ভ করার জন্য উইন্ডোজ পরিষেবা (সার্ভার 2003) সক্ষম করতে আমাকে .NET- তে দৃust় কোড লিখতে হবে। এটির সর্বোত্তম উপায় কী? এটি করার জন্য কিছু .NET এপিআই আছে?
উত্তর:
ব্যর্থতার পরে পরিষেবাটি পুনরায় চালু করতে সেট করুন (কন্ট্রোল প্যানেলে পরিষেবাটি ডাবল ক্লিক করুন এবং সেই ট্যাবগুলিতে ঘুরে দেখুন - আমি এর নামটি ভুলে যাই)। তারপরে, আপনি যে কোনও সময় পরিষেবাটি পুনঃসূচনা করতে চান, কেবল কল করুন Environment.Exit(1)
(বা কোনও শূন্য নয় এমন রিটার্ন) এবং ওএস আপনার জন্য এটি পুনরায় চালু করবে।
Service.ExitCode = 1
এবং কার্যকর করতে পারেন Service.Stop()
। এইভাবে এটি করা একটি উপযুক্ত শাটডাউন করার অনুমতি দেয় এবং এখনও পুনঃসূচনাটি ট্রিগার করে।
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()
আপনি নিশ্চিত হতে পারবেন না যে আপনার অ্যাকাউন্টের অধীনে যে ব্যবহারকারীর অ্যাকাউন্ট চলছে তার পরিষেবা বন্ধ এবং পুনঃসূচনা করার এমনকি অনুমতি রয়েছে।
আপনি একটি প্রক্রিয়া তৈরি করতে পারেন যা ডস কমান্ড প্রম্পট যা নিজেকে পুনরায় আরম্ভ করে:
Process process = new Process();
process.StartInfo.FileName = "cmd";
process.StartInfo.Arguments = "/c net stop \"servicename\" & net start \"servicename\"";
process.Start();
const string strCmdText = "/C net stop \"SERVICENAME\"&net start \"SERVICENAME\"";
Process.Start("CMD.exe", strCmdText);
SERVICENAME
আপনার পরিষেবার নাম কোথায় (পরিষেবা নামের জায়গাগুলির জন্য অ্যাকাউন্টে অন্তর্ভুক্ত ডাবল উক্তিগুলি অন্যথায় বাদ দেওয়া যেতে পারে)।
পরিষ্কার, কোনও স্বয়ং-পুনঃসূচনা কনফিগারেশন প্রয়োজন।
আপনি কেন এটি পুনরায় আরম্ভ করতে চান এটি তার উপর নির্ভর করবে।
আপনি যদি সময়ে সময়ে পরিষেবাটি নিজেকে পরিষ্কার করার জন্য কেবল সন্ধান করে থাকেন তবে আপনার পরিষেবাতে একটি টাইমার চলতে পারে যা পর্যায়ক্রমে খাঁটি রুটিনের কারণ হয়ে দাঁড়ায়।
আপনি যদি ব্যর্থতা পুনরায় চালু করার কোনও উপায় সন্ধান করছেন - পরিষেবা হোস্ট নিজেই সেটআপ করার সময় সেই ক্ষমতাটি সরবরাহ করতে পারে।
তাহলে কেন আপনাকে সার্ভারটি পুনরায় চালু করতে হবে? আপনি কি অর্জন করার চেষ্টা করছেন?
আমি মনে করি না আপনি কোনও স্বনির্ভর পরিষেবাতে পারবেন (যখন আপনি পুনঃসূচনা বলবেন তখন এটি পরিষেবাটি বন্ধ হয়ে যাবে, যা পুনঃসূচনা কমান্ডকে বাধাগ্রস্ত করবে, এবং এটি আর আর শুরু হবে না)। আপনি যদি দ্বিতীয় .exe (সার্ভিস ম্যানেজার শ্রেণি ব্যবহার করে এমন একটি কনসোল অ্যাপ্লিকেশন) যুক্ত করতে পারেন, তবে আপনি স্ট্যান্ডেলোন .exe বন্ধ করে পরিষেবাটি পুনরায় চালু করতে এবং তারপরে প্রস্থান করতে পারেন।
দ্বিতীয় চিন্তায়, আপনি সম্ভবত পরিষেবাটি সূচনা করার জন্য একটি নির্ধারিত টাস্কটি রেজিস্টার করতে পারেন (উদাহরণস্বরূপ 'কমান্ড-লাইন' at 'কমান্ড ব্যবহার করে) পরিষেবাটি শুরু করার জন্য এবং তারপরে এটি নিজেই বন্ধ হয়ে যেতে পারে; এটা সম্ভবত কাজ করবে।
ব্যাচ ফাইল বা 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) { }
}
আমি আপনার পরিষেবার পুনরায় আরম্ভের সময়সূচী করতে উইন্ডোজ শিডিউলারটি ব্যবহার করব। সমস্যাটি হ'ল আপনি নিজেকে পুনরায় আরম্ভ করতে পারবেন না তবে আপনি নিজেকে আটকাতে পারবেন। (আপনি যে শাখায় বসেছেন সেই শাখাটি আপনি মুছে ফেলেছেন ... আপনি যদি আমার সাদৃশ্য পান) আপনার জন্য এটি করার জন্য আপনার একটি পৃথক প্রক্রিয়া প্রয়োজন। উইন্ডোজ সিডিউলার একটি উপযুক্ত। তাত্ক্ষণিকভাবে সম্পাদন করতে আপনার পরিষেবা পুনরায় চালু করতে (এমনকি পরিষেবার মধ্যে থেকেই) একটি সময় কাজ নির্ধারণ করুন।
অন্যথায়, আপনাকে একটি "রাখাল" প্রক্রিয়া তৈরি করতে হবে যা এটি আপনার জন্য করে।
প্রশ্নের প্রথম প্রতিক্রিয়া হ'ল সহজ সমাধান: "পরিবেশ.এক্সিট (1)" আমি এটি উইন্ডোজ সার্ভার ২০০৮ আর 2 এ ব্যবহার করছি এবং এটি পুরোপুরি কার্যকরভাবে কাজ করে। পরিষেবাটি নিজেই বন্ধ হয়ে যায়, ও / এস 1 মিনিট অপেক্ষা করে, তারপরে এটি পুনরায় চালু করে।
আপনার আবেদনের জন্য মোড়ক হিসাবে এনটি পরিষেবাটি ব্যবহার করা আরও ভাল পদ্ধতির হতে পারে। যখন এনটি পরিষেবা শুরু হয়, আপনার অ্যাপ্লিকেশনটি "নিষ্ক্রিয়" মোডে শুরু হতে পারে কমান্ডটি শুরু হওয়ার অপেক্ষায় (বা স্বয়ংক্রিয়ভাবে শুরু করার জন্য কনফিগার করা হবে)।
কোনও গাড়ী চিন্তা করুন, যখন এটি শুরু হয় এটি অলস অবস্থায় শুরু হয়, আপনার আদেশটি এগিয়ে যাওয়ার বা বিপরীত হওয়ার অপেক্ষায়। এটি অন্যান্য সুবিধাগুলির জন্যও সহায়তা করে যেমন উন্নত দূরবর্তী প্রশাসন যেমন আপনি নিজের অ্যাপ্লিকেশনটি কীভাবে প্রকাশ করতে পারেন তা বেছে নিতে পারেন।
কেবল পাস হচ্ছে: এবং ভেবেছিলাম আমি কিছু অতিরিক্ত তথ্য যুক্ত করব ...
আপনি একটি ব্যতিক্রমও ছুঁড়ে দিতে পারেন, এটি উইন্ডো পরিষেবাটি স্বয়ংক্রিয়ভাবে বন্ধ করে দেবে, এবং অটো পুনরায় আরম্ভের বিকল্পগুলি কেবলমাত্র কিক ইন করবে with এর সাথে একমাত্র সমস্যাটি হ'ল যদি আপনার পিসিতে কোনও দেব-পরিবেশ থাকে তবে জেআইটি ভিতরে প্রবেশের চেষ্টা করে, এবং আপনি ডিবাগ ওয়াই / এন বলে একটি প্রম্পট পাবেন। না বলুন এবং তারপরে এটি বন্ধ হবে এবং তারপরে সঠিকভাবে পুনরায় শুরু করুন। (কোনও জেআইটিবিহীন পিসিতে এটি সমস্ত কাজ করে)। ইম ট্রলিংয়ের কারণ, এই জেআইটি কি উইন to-তে নতুন (এটি এক্সপি ইত্যাদির সাথে সূক্ষ্মভাবে কাজ করত) এবং আমি জেআইটি নিষ্ক্রিয় করার একটি উপায় অনুসন্ধান করার চেষ্টা করছি .... আমি পরিবেশের চেষ্টা করতে পারি hereএছাড়াও বর্ণিত পদ্ধতিটি এখানে দেখুন কীভাবে দেখুন যে খুব কাজ করে।
ক্রিস্টিয়ান: ব্রিস্টল, যুক্তরাজ্য
এইভাবে একটি পুনঃসূচনা.ব্যাট ফাইল তৈরি করুন
@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%
তারপরে আপনার% পরিষেবা% শুরু হওয়ার সাথে সাথে টাস্ক% টাস্কনাম% মুছুন
অ্যাপ্লিকেশন কোডটি হোস্ট করার জন্য একটি পৃথক অ্যাপডোমেন তৈরি করুন। যখন পুনঃসূচনা দরকার তখন আমরা অ্যাপডোমেনটি প্রক্রিয়া (উইন্ডোজ পরিষেবা) এর পরিবর্তে আনলোড এবং পুনরায় লোড করতে পারি। আইআইএস অ্যাপ পুলটি এভাবেই কাজ করে, তারা সরাসরি এসপ নেট অ্যাপটি চালায় না, তারা পৃথক অ্যাপডমিন ব্যবহার করে।
সবচেয়ে সহজ উপায় হল এর সাথে ব্যাচ ফাইল থাকা:
নেট স্টপ নেট শুরু
এবং আপনার পছন্দসই সময়ের ব্যবধানের সাথে ফাইলটি শিডিয়ুলারে যুক্ত করুন
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();
}
}