Python Win32 сервис

1

Я новичок в python и не имею опыта написания сервисов для Windows. Я попытался взломать службу Windows на основе нескольких обучающих программ, которые я нашел там.

Мне нужна эта служба, чтобы постоянно отслеживать каталог для изменений, и когда он видит изменение, он запускает script. Вот что я до сих пор:

import win32service
import win32serviceutil
import time

class aservice(win32serviceutil.ServiceFramework):
    _svc_name_ = "aservice"
    _svc_display_name_ = "aservice - It Does nothing"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.isAlive = True

    def SvcDoRun(self):
        import servicemanager
        while self.isAlive:
            # This is where i am trying to run my code...is that right?
            self.main()
            #servicemanager.LogInfoMsg("aservice - is alive and well")
            #time.sleep(5)
            #servicemanager.LogInfoMsg("aservice - Stopped")

    def SvcStop(self):
        import servicemanager
        servicemanager.LogInfoMsg("aservice - Recieved stop signal")
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.isAlive = False #this will make SvcDoRun() break the while loop at the next iteration.

    # This code monitors a directory for changes and calls a script when there is a change
    # At the moment, it creates a log file instead of calling the script
    def main(self):
        import os
        import win32file
        import win32con
        ACTIONS = {
            1: "Created",
            2: "Deleted",
            3: "Updated",
            4: "Renamed from something",
            5: "Ranamed to something"
        }

        FILE_LIST_DIRECTORY = 0x0001

        path_to_watch = "folder"
        hDir = win32file.CreateFile (
            path_to_watch,
            FILE_LIST_DIRECTORY,
            win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
            None,
            win32con.OPEN_EXISTING,
            win32con.FILE_FLAG_BACKUP_SEMANTICS,
            None
        )
        while 1:
            results = win32file.ReadDirectoryChangesW (
                hDir,
                1024,
                True,
                win32con.FILE_NOTIFY_CHANGE_FILE_NAME |
                win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
                win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
                win32con.FILE_NOTIFY_CHANGE_SIZE |
                win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
                win32con.FILE_NOTIFY_CHANGE_SECURITY,
                None,
                None
            )
            for action, file in results:
                #import script
                log = open ('log.txt', 'w')
                full_filename = os.path.join(path_to_watch)
                log.write(full_filename + ACTIONS.get(action, "Unknown"))
                log.close()

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

Любые идеи о том, что я делаю неправильно?

EDIT: Вот ошибка журнала событий, которую я получаю для нее.

Event Type: Error
Event Source:   aservice
Event Category: None
Event ID:   3
Date:       21/01/2010
Time:       11:27:43 AM
User:       N/A
Computer:
Description:
The instance SvcRun() method failed 
Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\win32\lib\win32serviceutil.py", line 806, in SvcRun
    self.SvcDoRun()
  File "D:\TEST\simpleservice2.py", line 35, in SvcDoRun
    self.main()
  File "D:\TEST\simpleservice2.py", line 72, in main
    None
error: (2, 'CreateFile', 'The system cannot find the file specified.') 
%2: %3
  • 1
    Что происходит? Вместо того, чтобы построчно просматривать код, было бы полезно иметь представление о том, что вы видите, чего не ожидаете, или какие-то подробности диагностики.
Теги:
winapi
pywin32
service

2 ответа

1
Лучший ответ

Я не знаком с pywin32 ServiceFramework, но на основе вашего кода и сообщения об ошибке, я уверен, у вас есть проблема с path_to_watch.

Я предполагаю, что вы дезинфицировали имя папки для своего примера, и вы действительно не ищете folder.

Как насчет:

  • Вы используете полный путь к папке? Текущий рабочий каталог службы может быть не таким, как вы ожидаете.
  • Вы избегаете любых обратных косых черт в пути к папке?

Попробуйте использовать:

path_to_watch = r"c:\foo\bar" + "\\" 
  • 0
    Спасибо, что обратили внимание на это, в моем оригинальном скрипте для тестирования я просто использовал «папку» в качестве пути, потому что он находился в той же директории, что и скрипт на python. Все, что мне нужно было сделать, это исправить это и путь к файлу журнала! Спасибо вы решили мою проблему :)
  • 2
    Вы никогда не можете завершить строку одним обратным слешем, так как он выходит за пределы окончательной кавычки. Либо пропустите последнюю косую черту, используйте прямую косую черту, которая также работает в Windows, удалите r и используйте двойную обратную косую черту или сделайте ее r "c: \ foo \ bar" + "\\"
Показать ещё 1 комментарий
2

Одна вещь, которую следует учитывать при использовании служб Windows, заключается в том, что по умолчанию они запускаются под учетной записью LOCAL_SYSTEM. Это означает, что применяются разрешения для локальных томов (LOCAL_SYSTEM, безусловно, может быть отказано в доступе к любой заданной папке), и что LOCAL_SYSTEM не имеет доступа к сетевым томам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню