вызов базы данных прерван даже с обработчиком сигнала - PullRequest
0 голосов
/ 11 января 2019

У меня есть скрипт, который зацикливается бесконечно и делает вызов Oracle через cx_oracle каждые X секунд. У меня также есть обработчик сигнала, который должен позволить сценарию корректно завершить работу после завершения процедуры оракула. Проблема, с которой я сталкиваюсь, заключается в том, что вызов оракула, кажется, прерывается с помощью sigint или sigterm, даже если я обрабатываю их.

Выдает следующую ошибку: ORA-01013: user requested cancel of current operation

Вот пример кода (обрезается):

def signal_handler(signum, frame):
        print time.strftime(settings.FDATE) + " - Quitting safely..."
        global exit
        try:
                exit = 1
        except KeyboardInterrupt:
                exit = 1
                print 'Script is quitting safely, please wait...'

signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)

while not exit:
    #database call here
    sleep 5 #actually taking this value from a settings file

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

1 Ответ

0 голосов
/ 23 января 2019

Вы правы, что Oracle использует SININT для отмены текущей операции. Чтобы избежать конфликта, вы можете рассмотреть возможность использования других сигналов, таких как SIGQUIT или SIGSTOP.

...