উইন্ডোজে পরিষেবা হিসাবে আপনি কীভাবে পাইথন স্ক্রিপ্টটি চালাবেন?


260

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

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

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

সম্পাদনা: এ পর্যন্ত সমস্ত উত্তরের জন্য ধন্যবাদ, সেগুলি বেশ ব্যাপক। আমি আরও একটি জিনিস জানতে চাই: উইন্ডোজ কীভাবে আমার পরিষেবা সম্পর্কে সচেতন? আমি কি দেশীয় উইন্ডোজ ইউটিলিটিগুলি দিয়ে এটি পরিচালনা করতে পারি? /Etc/init.d এ স্টার্ট / স্টপ স্ক্রিপ্ট রাখার সমতুল্য কি?


2
এই উইন্ডোজ পরিষেবা টেম্পলেটটি পরীক্ষা করুন এটি win32service API ব্যবহার করে ।
সিএমএস

উত্তর:


254

হ্যা, তুমি পারো. আমি এটা যে সঙ্গে অন্তর্ভুক্ত আসা pythoncom লাইব্রেরি ব্যবহার করে তা করতে ActivePython বা ইনস্টল করা যাবে pywin32 (উইন্ডোজ এক্সটেনশানগুলি পাইথন)।

এটি একটি সাধারণ পরিষেবার জন্য একটি প্রাথমিক কঙ্কাল:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        pass

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

আপনার কোডটি main()পদ্ধতিতে যাবে some সাধারণত কোনও ধরণের অসীম লুপের সাথে কোনও পতাকা চেক করে বাধা দেওয়া হতে পারে, যা আপনি SvcStopপদ্ধতিটিতে সেট করেছেন


21
এ কোড করার পরে আমি কীভাবে উইন্ডোজকে এটি পরিষেবা হিসাবে চালাতে বলি?
কিট

33
@ কিট: আপনার স্ক্রিপ্টটি "ইনস্টল" পরামিতি দিয়ে কমান্ড লাইন থেকে চালান। তারপরে আপনি উইন্ডোজের পরিষেবাদি তালিকায় আপনার অ্যাপ্লিকেশন দেখতে সক্ষম হবেন, যেখানে আপনি এটি শুরু করতে, থামাতে বা স্বয়ংক্রিয়ভাবে শুরু করার জন্য সেট করতে পারেন
রিকার্ডো রেয়েস

16
আপনি পাইথনকমকে বিশেষ উল্লেখ করেন এবং এটি আপনার উদাহরণ কোডে আমদানি করেন। সমস্যাটি হ'ল আপনি কখনই নিজের উদাহরণ কোডের কোথাও পাইথনকম ব্যবহার করেন না, আপনি কেবল এটি আমদানি করেন। কেন এটি বিশেষ উল্লেখ করবেন এবং তার ব্যবহারটি প্রদর্শন করবেন না কেন?
বাটনস 840

10
কেন জন্য socket.setdefaulttimeout(60)? এটি কি কোনও পরিষেবার জন্য প্রয়োজন, বা এটি কি দুর্ঘটনাজনকভাবে কিছু বিদ্যমান পরিষেবা থেকে অনুলিপি করা হয়েছিল? :)
তৈমুর

7
chrisumbel.com/article/windows_services_in_python এটি একটি একই উদাহরণ তবে আরও সম্পূর্ণ
csprabala

41

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

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

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


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

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

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

4
ট্রিকটি হ'ল পাইথন.এক্সই কে একটি পরিষেবা হিসাবে এবং আপনার পাইথন স্ক্রিপ্টটিকে প্যারামিটার হিসাবে চালানো: "এনএসএম ইনস্টল মাই সার্ভিসনাম সি: y পাইথন 27 \ পাইথন.এক্সসি সি: \ টেম্প \ myscript.py"
পোলেগুই

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

25

সবচেয়ে সহজ উপায়টি হ'ল : এনএসএসএম - নন-চোষা পরিষেবা পরিচালক:

1 - https://nssm.cc/download এ ডাউনলোড করুন

2 - পাইথন প্রোগ্রামটি পরিষেবা হিসাবে ইনস্টল করুন: অ্যাডমিন হিসাবে প্রম্পট করুন

c:> nssm.exe WinService ইনস্টল করুন

3 - এনএসএসএমের কনসোলে:

পথ: সি: \ পাইথন 27 \ পাইথন 27.exe

প্রারম্ভিক ডিরেক্টরি: সি: \ পাইথন 27

যুক্তি: সি: \ উইনসোর্স.পি

4 - Services.msc এ তৈরি পরিষেবাদিগুলি পরীক্ষা করুন


আমি nssm.exe ব্যবহার করে আমার ভিজ্যুয়াল স্টুডিও সি ++ .exe কে পরিষেবা হিসাবে ইনস্টল করতাম এবং এখন আমি পাইথন .pyc হিসাবে পরিষেবা হিসাবে nssm.exe ব্যবহার করতে পারি। ধন্যবাদ।
ইটারিকি

দ্রষ্টব্য: যদি আপনার * .py স্ক্রিপ্টটি স্থান সহ একটি ফোল্ডারে অবস্থিত (যেমন: সি: \ প্রোগ্রাম ফাইলগুলি app myapp.py) উদ্ধৃতিতে আর্গুমেন্ট নির্দিষ্ট করা দরকার: আর্গুমেন্ট: "সি: \ প্রোগ্রাম ফাইলগুলি \ myapp.py"
ইউরি কোজলভ

ভার্চুয়াল পরিবেশ কীভাবে সরবরাহ করবেন?
শাইখ

24

এটি অর্জনের সহজ উপায় হ'ল নেটিভ কমান্ড sc.exe ব্যবহার করা:

sc create PythonApp binPath= "C:\Python34\Python.exe --C:\tmp\pythonscript.py"

তথ্যসূত্র:

  1. https://technet.microsoft.com/en-us/library/cc990289(v=ws.11).aspx
  2. Sc.exe দিয়ে একটি পরিষেবা তৈরি করার সময় প্রসঙ্গের পরামিতিগুলিতে কীভাবে পাস করবেন?

আমি মনে করি, এটি আপনার আদেশ বা প্রয়োগের ক্ষেত্রেই একটি সমস্যা। যাই হোক, এই পরীক্ষা support.microsoft.com/en-us/help/886695/...
pyOwner

আমার অ্যাপ্লিকেশন পরিষেবার বাইরে সূক্ষ্মভাবে কাজ করে এবং আমি কোনও ফলাফল ছাড়াই উপরে একই কোডটি ব্যবহার করেছি।
নিম্রেসাম

ভার্চুয়াল পরিবেশ কীভাবে সরবরাহ করবেন?
শাইখ মোড করেছেন

আপনি কি ভার্চুয়ালেনভ চেষ্টা করেছেন?
পাইওয়ানার

1
এটি কাজ করে না। উইন্ডোজ পরিষেবা অবশ্যই একটি নির্দিষ্ট ইন্টারফেস প্রকাশ করতে হবে যা পাইউইন 32 প্যাকেজটি করে। তবে একটি সরল পুরাতন পাইথন স্ক্রিপ্ট যথেষ্ট হবে না।
সিদ্ধার্থ গান্ধী

23

কার্যত কোনও উইন্ডোজ এক্সিকিউটেবল হিসাবে পরিষেবা হিসাবে ইনস্টল করার জন্য কয়েকটি বিকল্প রয়েছে।

পদ্ধতি 1: rktools.exe থেকে instsrv এবং srvany ব্যবহার করুন

উইন্ডোজ হোম সার্ভার বা উইন্ডোজ সার্ভার 2003 (উইনএক্সপি-র সাথেও কাজ করে), উইন্ডোজ সার্ভার 2003 রিসোর্স কিট সরঞ্জামগুলি এমন ইউটিলিটিগুলির সাথে আসে যা এটির জন্য ব্যবহৃত হতে পারে, এটি ইনসট্রভ.এক্সি এবং এসআরওয়ানি.এক্সই নামে পরিচিত । এই ব্যবহারগুলি কীভাবে ব্যবহার করতে হয় তার বিশদ জানতে এই মাইক্রোসফ্ট কেবি নিবন্ধটি KB137890 দেখুন ।

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

পদ্ধতি 2: উইন্ডোজ এনটি-র জন্য সার্ভিস ইনস্টলার ব্যবহার করুন

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

পাইথন স্ক্রিপ্ট ইনস্টল করা হচ্ছে

একটি নতুন পরিষেবা তৈরি করতে সার্ভিস ইনস্টলারের চালান। (এই উদাহরণে, ধারণা করা হয় যে সি: \ পাইথন 25 এ পাইথন ইনস্টল করা আছে)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:\python25\python.exe
Arguments : c:\path_to_your_python_script\test.py
Working Directory : c:\path_to_your_python_script

ইনস্টল করার পরে, কন্ট্রোল প্যানেলের পরিষেবাদি অ্যাপলেট খুলুন, পাইথন টেস্ট পরিষেবাটি নির্বাচন করুন এবং শুরু করুন।

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

আমি কি সার্ভিস হিসাবে একটি পাইথন স্ক্রিপ্ট চালাতে পারি (উইন্ডোজে)? কিভাবে?

পাইথনে আমি যে পরিষেবা লিখেছি সে সম্পর্কে আমি কীভাবে উইন্ডোজকে সচেতন করব?


আমি শুধু খেয়াল অন্যান্য অনুরূপ Q & A- ইতিমধ্যে আছেন: stackoverflow.com/questions/32404/... stackoverflow.com/questions/34328/...
popcnt

পরিষেবা ইনস্টলার একটি 64 বিট আর্কিটেকচারে কাজ করে না তাই বিকল্প 1টি গোটো বিকল্প হয়ে যায়।
নোহ ক্যাম্পবেল

সার্ভিস ইনস্টলারের উপরের লিঙ্কটি আর কাজ করে না। আমি এটি এখানে পেয়েছি: sites.google.com/site/conort/…
LarsH

2
অফ নোট, আমি মনে করি না যে NTনামটির অপরিহার্যভাবে "বিপরীত" হবে, কমপক্ষে প্রোগ্রামার-লোকের বক্তৃতায় নয়। এটি কেবল "এনটি ব্র্যান্ড " এর বিপরীতে "এনটি আর্কিটেকচার " বোঝায় । এটি বলেছিল, উইকিপিডিয়ায় আলাপ অনুসারে এটি বিতর্ক অবধি, যেহেতু "এটি কোনও আনুষ্ঠানিক মাইক্রোসফ্ট শব্দ নয়", তবে তবুও এই চিন্তাভাবনার একটি traditionতিহ্য রয়েছে।
n611x007

15

কীভাবে এটি কাজ করবে তা ধাপে ধাপে:

1- উপরে উল্লিখিত বেসিক কঙ্কাল অনুসারে একটি পাইথন ফাইল তৈরি করুন। এবং এটিকে একটি পথে সংরক্ষণ করুন উদাহরণস্বরূপ: "সি: \ পাইথনফায়ালস \ অ্যাপসবার্সভিসিপি

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"


    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                          servicemanager.PYS_SERVICE_STARTED,
                          (self._svc_name_,''))
        self.main()

    def main(self):
        # Your business logic or call to any class should be here
        # this time it creates a text.txt and writes Test Service in a daily manner 
        f = open('C:\\test.txt', 'a')
        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            f.write('Test Service  \n')
            f.flush()
            # block for 24*60*60 seconds and wait for a stop event
            # it is used for a one-day loop
            rc = win32event.WaitForSingleObject(self.hWaitStop, 24 * 60 * 60 * 1000)
        f.write('shut down \n')
        f.close()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

2 - এই পদক্ষেপে আমাদের আমাদের পরিষেবাটি নিবন্ধিত করা উচিত।

প্রশাসক হিসাবে কমান্ড প্রম্পট রান করুন এবং টাইপ করুন:

sc টেস্ট সার্ভিস বিনপথ = "সি: \ পাইথন 36 \ পাইথন.এক্স.সি: সি: \ পাইথনফায়ালস \ অ্যাপসার্ভারসভিসি.পি

প্রথম যুক্তি binpath হয় python.exe পথ

দ্বিতীয় যুক্তি binpath হয় আপনার পাইথন ফাইলের পাথ যে আমরা ইতিমধ্যে তৈরি

মিস করবেন না যে প্রতি " = " চিহ্নের পরে আপনার একটি জায়গা রাখা উচিত ।

তারপরে সবকিছু ঠিকঠাক থাকলে আপনার দেখা উচিত

[এসসি] ক্রিয়েট সার্ভিস সাফল্য

এখন আপনার অজগর পরিষেবাটি এখন উইন্ডোজ পরিষেবা হিসাবে ইনস্টল করা আছে। আপনি এটি সার্ভিস ম্যানেজার এবং রেজিস্ট্রি এর নীচে দেখতে পারেন:

HKEY_LOCAL_MACHINE \ সিস্টেম \ CurrentControlSet \ সার্ভিস \ TestService

3- এখন ঠিক আছে। আপনি পরিষেবা পরিচালকের উপর আপনার পরিষেবা শুরু করতে পারেন।

আপনি প্রতিটি পাইথন ফাইল কার্যকর করতে পারেন যা এই পরিষেবাটি কঙ্কাল সরবরাহ করে।


কীভাবে ব্যবহার করতে হবে SetEvent(self.hWaitStop)এবং কীভাবে রয়েছে তার অনেকগুলি খারাপ উদাহরণ রয়েছে WaitForSingleObject। সম্ভবত এখানে নির্বাচিত উত্তরের অনবদ্য কপি করার উপর ভিত্তি করে। এটি করার একটি ভাল উপায় যা "ডিবাগ" উভয়ের পক্ষে পরিষ্কারভাবে কাজ করে "স্টপ" যুক্তি শেষ করে। (এসসি ব্যবহারের অংশটি যখন HandleCommandLineকাজটি করে তখন তা অপ্রয়োজনীয় মনে হয়, এবং ডিবাগ চালাতে পারে))
আলিয়াস_নাগগ

3

পিএসসি: পাইথনে পরিষেবা নিয়ন্ত্রণ পরিচালক

পাইথনহসটেড.org থেকে নেওয়া পরিষেবা হিসাবে চালনার উদাহরণ স্ক্রিপ্ট :

from xmlrpc.server import SimpleXMLRPCServer

from pysc import event_stop


class TestServer:

    def echo(self, msg):
        return msg


if __name__ == '__main__':
    server = SimpleXMLRPCServer(('127.0.0.1', 9001))

    @event_stop
    def stop():
        server.server_close()

    server.register_instance(TestServer())
    server.serve_forever()

পরিষেবা তৈরি এবং শুরু করুন

import os
import sys
from xmlrpc.client import ServerProxy

import pysc


if __name__ == '__main__':
    service_name = 'test_xmlrpc_server'
    script_path = os.path.join(
        os.path.dirname(__file__), 'xmlrpc_server.py'
    )
    pysc.create(
        service_name=service_name,
        cmd=[sys.executable, script_path]
    )
    pysc.start(service_name)

    client = ServerProxy('http://127.0.0.1:9001')
    print(client.echo('test scm'))

পরিষেবা বন্ধ করুন এবং মুছুন

import pysc

service_name = 'test_xmlrpc_server'

pysc.stop(service_name)
pysc.delete(service_name)
pip install pysc

3
কেউ কেন জানে কেন এই ডাউনটা পেয়েছে? এটি দেখতে দুর্দান্ত সমাধান বলে মনে হচ্ছে।
জারোদ চেসনি

3

আমি পাইভিন 32 এর সাথে পরিষেবা হিসাবে হোস্টিং শুরু করেছি

সবকিছু ঠিকঠাক ছিল তবে আমি সমস্যার মুখোমুখি হয়েছি যে সিস্টেমটি শুরু করার সময় পরিষেবাটি 30 সেকেন্ডের মধ্যে (উইন্ডোজের জন্য ডিফল্ট সময়সীমা) চালু করতে সক্ষম হয় নি। এটি আমার পক্ষে সমালোচনামূলক কারণ উইন্ডোজ স্টার্টআপটি একটি ফিজিকাল মেশিনে হোস্ট করা বেশ কয়েকটি ভার্চুয়াল মেশিনে একসাথে হয়েছিল এবং আইও বোঝা বিশাল was ত্রুটি বার্তা ছিল:

Error 1053: The service did not respond to the start or control request in a timely fashion.

Error 7009: Timeout (30000 milliseconds) waiting for the <ServiceName> service to connect.

পাইউইনের সাথে আমি অনেক লড়াই করেছি, তবে এনএসএসএম ব্যবহার করে শেষ করেছি কারণ এটি এই উত্তরে প্রস্তাবিত হয়েছিল । এটিতে মাইগ্রেশন করা খুব সহজ ছিল।


2

পাইথন 3+ এ এনএসএম

(আমি আমার .py ফাইলটি পাইস্টলারের সাথে। এক্সিতে রূপান্তরিত করেছি )

nssm: যেমন আগে বলা হয়েছে

  • ss সার্ভিসনাম n এনএসএস ইনস্টল চালান
  • এনএসএসএমের কনসোলে:

    পাথ: আপনার \ program.exe path থেকে। পথ

    প্রারম্ভিক ডিরেক্টরি: পথটি \ থেকে \ আপনার \ # পথ হিসাবে একই তবে আপনার প্রোগ্রাম.এক্সে ছাড়াই

    যুক্তি: খালি

আপনি যদি আপনার প্রকল্পকে .exe তে রূপান্তর করতে না চান

  • দিয়ে একটি .bat ফাইল তৈরি করুন python {{your python.py file name}}
  • এবং .bat ফাইলের জন্য পথ নির্ধারণ করুন

ভার্চুয়াল পরিবেশ কীভাবে সরবরাহ করবেন?
শাইখ

1

লুপ বা সাবথ্রেড ব্যবহার করে একটি সম্পূর্ণ পাইভিন 32 উদাহরণ

কয়েক দিন এটি চালু এবং বন্ধ রাখার পরে, উত্তরটি আমি খুঁজে পেতে ইচ্ছুক হত, পাইওয়ুইন 32 ব্যবহার করে এটি সুন্দর এবং স্বতঃস্ফূর্তভাবে রাখে।

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

আমিও নোট মত সেখানে আউট উদাহরণ লোড মত মনে করা হয় যে would এই যে প্রায় উপযোগী, কিন্তু বাস্তবে বিভ্রান্তিকর কারণ তারা কাটা এবং আটকানো অন্যান্য উদাহরণ অন্ধ আছে। আমার ভুল হতে পারে. তবে আপনি যদি কোনও ইভেন্টের জন্য অপেক্ষা না করেন তবে কেন একটি ইভেন্ট তৈরি করবেন?

এটি বলেছিল আমি এখনও অনুভব করছি যে আমি এখানে কিছুটা নড়বড়ে মাটিতে রয়েছি, বিশেষত থ্রেড সংস্করণ থেকে প্রস্থানটি কতটা পরিষ্কার তা সম্পর্কে, তবে কমপক্ষে আমি বিশ্বাস করি এখানে বিভ্রান্তিকর কিছুই নেই।

চালানোর জন্য কোনও ফাইলটিতে কোডটি অনুলিপি করুন এবং নির্দেশাবলী অনুসরণ করুন।

হালনাগাদ:

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

# uncomment mainthread() or mainloop() call below
# run without parameters to see HandleCommandLine options
# install service with "install" and remove with "remove"
# run with "debug" to see print statements
# with "start" and "stop" watch for files to appear
# check Windows EventViever for log messages

import socket
import sys
import threading
import time
from random import randint
from os import path

import servicemanager
import win32event
import win32service
import win32serviceutil
# see http://timgolden.me.uk/pywin32-docs/contents.html for details


def dummytask_once(msg='once'):
    fn = path.join(path.dirname(__file__),
                '%s_%s.txt' % (msg, randint(1, 10000)))
    with open(fn, 'w') as fh:
        print(fn)
        fh.write('')


def dummytask_loop():
    global do_run
    while do_run:
        dummytask_once(msg='loop')
        time.sleep(3)


class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global do_run
        do_run = True
        print('thread start\n')
        dummytask_loop()
        print('thread done\n')

    def exit(self):
        global do_run
        do_run = False


class SMWinservice(win32serviceutil.ServiceFramework):
    _svc_name_ = 'PyWinSvc'
    _svc_display_name_ = 'Python Windows Service'
    _svc_description_ = 'An example of a windows service in Python'

    @classmethod
    def parse_command_line(cls):
        win32serviceutil.HandleCommandLine(cls)

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.stopEvt = win32event.CreateEvent(None, 0, 0, None)  # create generic event
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                            servicemanager.PYS_SERVICE_STOPPED,
                            (self._svc_name_, ''))
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stopEvt)  # raise event

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                            servicemanager.PYS_SERVICE_STARTED,
                            (self._svc_name_, ''))
        # UNCOMMENT ONE OF THESE
        # self.mainthread()
        # self.mainloop()

    # Wait for stopEvt indefinitely after starting thread.
    def mainthread(self):
        print('main start')
        self.server = MyThread()
        self.server.start()
        print('wait for win32event')
        win32event.WaitForSingleObject(self.stopEvt, win32event.INFINITE)
        self.server.exit()
        print('wait for thread')
        self.server.join()
        print('main done')

    # Wait for stopEvt event in loop.
    def mainloop(self):
        print('loop start')
        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            dummytask_once()
            rc = win32event.WaitForSingleObject(self.stopEvt, 3000)
        print('loop done')


if __name__ == '__main__':
    SMWinservice.parse_command_line()

0

গ্রহণযোগ্য উত্তর win32serviceutilকাজ করে তবে জটিল এবং ডিবাগিং করে এবং আরও শক্ত পরিবর্তন করে। এটা পর্যন্ত NSSM (সহজে ব্যবহারযোগ্য করতে অ চোষা পরিষেবা ম্যানেজার) । আপনি একটি সাধারণ অজগর প্রোগ্রামটি লিখে এবং স্বাচ্ছন্দ্যে ডিবাগ করেন এবং শেষ পর্যন্ত এটি কাজ করে আপনি এনএসএসএম ব্যবহার করে এটি একটি মিনিটেরও কম সময়ে পরিষেবা হিসাবে ইনস্টল করতে:

একটি উন্নত (প্রশাসক) কমান্ড প্রম্পট থেকে আপনি চালিত হন nssm.exe install NameOfYourServiceএবং আপনি এই বিকল্পগুলি পূরণ করুন:

  • পাথ : (পাইথন.এক্স.এইC:\Python27\Python.exe )
  • যুক্তি : (আপনার অজগর স্ক্রিপ্টের পথ, যেমন c:\path\to\program.py)

যাইহোক, আপনার প্রোগ্রামটি যদি কোনও লগ ফাইল রাখতে চান এমন দরকারী বার্তাগুলি প্রিন্ট করে তবে এনএসএসএম আপনার পক্ষে এটি এবং আরও অনেক কিছু পরিচালনা করতে পারে।


হ্যাঁ, এটি অ্যাড্রিয়ানোর উত্তরের একটি সদৃশ। আমি সেই উত্তরটিকে উঁচু করে এডিট করার চেষ্টা করেছি তবে সম্পাদনার পরে আমি একটি নতুন উত্তর খুঁজছিলাম।
এনডেমো

ভার্চুয়াল পরিবেশ কীভাবে সরবরাহ করবেন?
শাইখ

0

যে কেউ ভেনভি বা পাইচার্মে পরিষেবা তৈরি করতে চায় তার জন্য !!!!!!!

সমস্ত আনওয়ার পড়ার পরে এবং কিছু স্ক্রিপ্ট তৈরি করুন, আপনি চালাতে পারেন python service.py installএবং যদি python service.py debug, তবেpython service.py start তার কোনও প্রতিক্রিয়া নেই।

হতে পারে এটি ভেনভ সমস্যার কারণে ঘটেছে, কারণ উইন্ডোজ পরিষেবাটি এক্সিকিউটর মাধ্যমে আপনার পরিষেবা শুরু করে PROJECT\venv\Lib\site-packages\win32\pythonservice.exe

আরও ত্রুটির বিশদ জানতে আপনার পরিষেবাটি ব্যবহার করতে powershellবা cmdপরীক্ষা করতে পারেন ।

PS C:\Users\oraant> E:

PS E:\> cd \Software\PythonService\venv\Lib\site-packages\win32

PS E:\Software\PythonService\venv\Lib\site-packages\win32> .\pythonservice.exe -debug ttttt
Debugging service ttttt - press Ctrl+C to stop.
Error 0xC0000004 - Python could not import the service's module

Traceback (most recent call last):
  File "E:\Software\PythonService\my_service.py", line 2, in <module>
    import win32serviceutil
ModuleNotFoundError: No module named 'win32serviceutil'

(null): (null)

আপনি যদি আমার মতো কিছু ত্রুটি পান তবে আপনি আমার অন্য কোনও প্রশ্নের উত্তরটি পরীক্ষা করতে পারেন, আমি এটি ঠিক করেছি এবং আমার কোডটি এখানে পোস্ট করব ।


-1

https://www.chrisumbel.com/article/windows_services_in_python

  1. PySvc.py অনুসরণ করুন

  2. dll ফোল্ডার পরিবর্তন করা হচ্ছে

আমি জানি এটি পুরানো তবে আমি চিরদিনের জন্য এটিতে আটকে ছিলাম। আমার জন্য, এই নির্দিষ্ট সমস্যাটি এই ফাইলটি অনুলিপি করার মাধ্যমে সমাধান করা হয়েছিল - pywintypes36.dll

থেকে -> পাইথন 36 \ Lib \ সাইট-প্যাকেজ \ পাইউইন 32_সিস্টেম 32

প্রতি -> পাইথন 36 \ Lib \ সাইট-প্যাকেজ \ win32

setx /M PATH "%PATH%;C:\Users\user\AppData\Local\Programs\Python\Python38-32;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Scripts;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\pywin32_system32;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\win32
  1. দ্বারা পাইথন ফোল্ডারে পথ পরিবর্তন করা

cd C:\Users\user\AppData\Local\Programs\Python\Python38-32

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