amarao (amarao_san) wrote,
amarao
amarao_san

Category:

Убейте меня кто-нибудь...

Роскомнадзор: это призыв к суициду с детальным описанием метода.

MAIN_PID = os.getpid()
pid = ctypes.CDLL("libc.so.6").fork()
if pid == 0:
        try:
                hung()
        except thread_timeout.FailedKillExecTimeout:
                print "timeout, terminating"
                os.kill(MAIN_PID, 9)
                raise SystemExit
        do_something()
        os.kill(MAIN_PID, 9)
else:
        while True:
                time.sleep(100000000)


Пересказ на словах:

1) Запоминаем PID основного процесса.
2) Форкаемся
3) Основной процесс при этом уходит в бесконечный цикл, но обрабатывает сигналы. Он же держит консоль баша. Завершается после kill -9.
4) Потомок: пытается выполнить плохую функцию. В отдельном треде.
5) Если функция нормально завершилась, то просто продолжает работать. Когда заканчивает - посылает kill -9 в родителя и завершается.
6) Если мы поймали таймаут выполнения (то есть "всё плохо"), то: посылает kill -9 в родителя и пытается выйти (на практике - зависает навсегда).

И да, оно возвращает управление в консоль и т.д. Вероятнее всего, для чистоты эксперимента надо сделать обработчик сигналов, который все сигналы передаёт потомку.



Какой пиздец. Какой невероятный, измученный жизнью пиздец. И да, это сейчас поползёт в продакшен, потому что жить-то надо. И, насколько я понимаю, это официальное решение проблемы. Потому что syscall (1) не завершает процесс при неубиваемом процессе. И как отцепиться от баша - не понятно.

Вот именно эта часть мне не понятна. Что именно происходит при SIGTSTP? Как процесс уходит в bg для баша? Что процессу надо сделать, чтобы стать "bg" для баша?
Tags: python, thread_timeout
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 33 comments