LINUX.ORG.RU

История изменений

Исправление peregrine, (текущая версия) :

Понял уже. Жаль что очень удобно обработку в одном месте не получится сделать. Будет разорванная логика. С учётом всего в треде выходит что-то вроде:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import signal
import os
from time import sleep


class PerfectKiller:
    kill_now = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_gracefully)
        signal.signal(signal.SIGTERM, self.exit_gracefully)
        self.signal = None

    def exit_gracefully(self, signum, frame):
        self.signal = signum
        self.kill_now = True

    def perfect_exit(self):
        if self.signal is not None:
            signal.signal(self.signal, signal.SIG_DFL)
            os.kill(os.getpid(), self.signal)


print('Press Ctrl+C')
a = 0
killer = PerfectKiller()
while not killer.kill_now:
    a += 1
    sleep(2)
    a += 1
    print(a)
print(f'типо сохранение {a}')
killer.perfect_exit()
Внимание вопрос, особенно к wandrien не налажал ли я где-то тут? Оно вроде нормально работает, но учитывая подводный камень с особенностями «самоубийства процесса» правильным сигналом можно и легко налажать. Люди, даже в ряде проектов на гитхабе делали выход просто через sys.exit с нужным кодом, хотя если верить ссылке это шляпа.

Исходная версия peregrine, :

Понял уже. Жаль что очень удобно обработку в одном месте не получится сделать. Будет разорванная логика. С учётом всего в треде выходит что-то вроде:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import signal
import os
from time import sleep


class PerfectKiller:
    kill_now = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_gracefully)
        signal.signal(signal.SIGTERM, self.exit_gracefully)
        self.signal = None

    def exit_gracefully(self, signum, frame):
        self.signal = signum
        self.kill_now = True

    def perfect_exit(self):
        if self.signal is not None:
            signal.signal(self.signal, signal.SIG_DFL)
            os.kill(os.getpid(), self.signal)


print('Press Ctrl+C')
a = 0
killer = PerfectKiller()
while not killer.kill_now:
    a += 1
    sleep(2)
    a += 1
    print(a)
print(f'типо сохранение {a}')
killer.perfect_exit()
Внимание вопрос, особенно к wandrien не налажал ли я где-то тут? Оно вроде нормально работает, но учитывая подводный камень с особенностями «самоубийства процесса» правильным сигналом можно и легко наложать. Люди, даже в ряде проектов на гитхабе делали выход просто через sys.exit с нужным кодом, хотя если верить ссылке это шляпа.