Обработанный сигнал в Python вызывает прерывание FTP-соединения - PullRequest
0 голосов
/ 04 октября 2010

Этот сценарий проверяет FTP и загружает файлы через запланированные интервалы.

Отправка на него правильного сигнала (SIGUSR1) должна изящно закрыть его, ожидая завершения проверки, если она запущена.

class ScheduledFtpCheck(FtpCheck, Scheduler):
    def __init__(self):
         ...
         self.aborted, self.checking = False, False

    def abort(self, *args, **kwargs):
        self.aborted = True
        if not self.checking: self.quit()

    def checkAll(self):
        if not self.isAborted():
            self.checking = True
            self.checkAll()
            self.checking = False
            if self.aborted: self.quit()

    ...

def main():
    sch = ScheduledFtpCheck()
    signal.signal(signal.SIGUSR1, sch.abort)
    sch.start()

проблема в том, что я получаю прерванный системный вызов, из-за которого ftplib.FTP преждевременно завершает работу:

Traceback (most recent call last):
  File "/root/my-applications/sensor/sensor/lib/importutils2.py", line 137, in connectAndCheckAll
    try: self.checkAll()
  ...
  File "/usr/lib/python2.6/ftplib.py", line 182, in getline
    line = self.file.readline()
  File "/usr/lib/python2.6/socket.py", line 406, in readline
    data = self._sock.recv(self._rbufsize)
error: [Errno 4] Interrupted system call

Так что мой скрипт обрабатывает сигнал правильно, а плановая проверка - нет.

Почему? Как я могу предотвратить это?

Спасибо за вашу поддержку

1 Ответ

0 голосов
/ 04 октября 2010

Я нашел себе решение:

запуск процесса ftp в отдельном потоке, который изолировал его от сигналов основного процесса

threading.Thread(target=self.checkAll).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...