• При каких обстоятельствах запущен данный процесс python-программы?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Посмотреть, что происходит с программой можно через lsof -p PID-процесса, если это линукс.

    Также можно через gdb подключиться к процессу - https://wiki.python.org/moin/DebuggingWithGdb
    и есть еще pyrasite https://gist.github.com/reywood/e221c4061bbf2eccea...

    PS. Если ничего не помогает, то можно воспользоваться strace -p PID
    Но в системе его желательно включить командой # echo 0 > /proc/sys/kernel/yama/ptrace_scope
    Ответ написан
    5 комментариев
  • При каких обстоятельствах запущен данный процесс python-программы?

    Vindicar
    @Vindicar
    RTFM!
    Я бы попробовал использовать аудит-хук.
    Многие функции питона генерят события аудита, на которые можно подписаться.
    Есть полная таблица событий для CPython, но тебя будут интересовать события типа subprocess.Popen, os.system, os.spawn, os.startfile, os.exec, os.fork и так далее.
    Внутри хука можешь попробовать вызвать traceback.format_stack() чтобы узнать текущий стек вызовов, и записать его в какой-нибудь журнал работы.
    import sys
    import traceback
    # хук который ловит событие импорта модуля
    def hook(event, args):
        if event != 'import':
            return
        name, filename = args[0], args[1]
        callstack = traceback.extract_stack(limit=None)
        print(event, name, filename)
        for item in traceback.format_list(callstack):
            print('    ', item.strip())
    
    sys.addaudithook(hook)
    
    import json
    
    print('Done')


    Это сработает только если процессы спавнятся средствами питона, а не каким-нибудь скомпилированным расширением.

    Также можешь поискать использование модуля multiprocessing, это тоже вероятный кандидат.
    Ответ написан
    1 комментарий
  • Как стать специалистом по информационной безопасности (кибербезопасность)?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    //COPY01 EXEC PGM=IEBGENER
    Ить, да вас прорвало, что ли? Вроде не конец учебного года, чего все так кинулись в ИБ?

    Если ты думаешь, что вот стану ИБ-шником и буду только тестить сайты и ломать вирусню - ты ошибаешься. Нет, этим ИБ тоже занимается. Но - в крупных конторах типа Касперского. А в конторах помельче - ИБ-шник, как админ - как правило один штука (редко два - это уже достаточно большая контора должна быть).

    И задачи у него могут быть ... специфические.

    Нет, там конечно много и обычной админской работы - прокси, файрволлы, VPN, права доступа, сертификаты, разрешение на установку ПО, туда не хади - сюда хади (СКУД и видеонаблюдение). Но я уже тут пальцы стер писать, что ИБ не только про компы. ИБ это еще и про людей, и вот это "про людей" может быть сильно неприятным - СМП, чтение почты, отсмотр чем человек занимался...

    Я уже неоднократно сравнивал ИБ-шника с гинекологом - те, кто не в теме - думают, что это прикольная работа - постоянно на голых баб смотреть :) те же, кто в теме - знают, что это просто работа и в ней очень много грязи и вони, потому что связана она с человеческим организмом и его метаболизмом...

    Ну и еще - желательно знание законодательной базы и умение писать документацию... На самом деле, романтики в ИБ - микроскопическое количество. Это просто работа, иногда скучная и нудная, иногда даже грязная и неприятная...
    Ответ написан
  • Как работает asyncio.sleep?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть такой системный вызов select (а также подобные ему poll, epoll итд), суть которого - передать массив файловых дескрипторов (частный случай - сетевых соединений) и затем при получении событий ввода-вывода получить список тех дескрипторов, в которых произошёл ввод-вывод. Важно понимать, что при это программа "засыпает", передаёт управление ОС и не тратит ресурсов. ОС сама разбудит программу при наступлении нужных событий (записался файл, пришли новые сетевые байтики итд). Высокопроизводительные сетевые приложения (типа nginx, haproxy итд) используют подобный подход для того, чтобы эффективно обрабатывать большое количество сетевого трафика одновременно.

    asyncio работает как раз примерно по тому же принципу. Когда случается ввод-вывод, нужная функция "засыпает", а управление передаётся потоку событий. Соответственно, он либо находит задачу, которая ожидает выполнения и передаёт ей управление, либо видит, что все задачи уже одидают какого-нибудь ввода-вывода и запускает select на все ожидающие дескрипторы (возможно, в реальности используется не select, а какой-то из его аналогов, но это для нас сейчас непринципиально). Как только приходит событие, программа просыпается, поток событий находит нужное событие и передаёт управление соответствующей задаче, которая его ожидала. Это позволяет очень эффективно в один поток работать с задачами, которые много ожидают ввода-вывода, но мало выполняют реальной процессорной работы.

    Обычный ввод/вывод является блокирующим: пока не будет выполнена операция (чтение/запись/передача/приём), программа приостанавливает свою работу в ожидании. В asyncio весь ввод-вывод является неблокирующим: операции ввода-вывода не приостанавливают работу программы, а позволяют перейти к другим ожидающим задачам.

    Обычный вызов sleep приводит к приостановке и засыпанию программы на указанное время (с передачей управления ОС), и в ней в это время ничего не выполняется. Как только время истечёт, ОС вернёт управление программе. Всё это время программа не работает, события ввода-вывода не обрабатывает.

    В то же время asyncio.sleep возвращает управление потоку событий, а не ОС, что позволяет переключиться на выполнение других задач, обработать новые события итд итп. Программа не останавливается и управление ОС не передаёт (ну, кроме сна в процессе исполнения select), поэтому asyncio.sleep приводит к неблокирующему засыпанию, не мешающему выполнять задачи, которым ждать окончания сна одной конкретной задачи не нужно. Когда истечёт не менее чем указанное в asyncio.sleep время, поток событий вернёт управление приостановленной задаче.

    Важно отметить, что и sleep, и asyncio.sleep не гарантируют, что функция возобновит работу через указанное число секунд, а не позже, но при этом sleep делает это значительно точнее. Потому что возврат в вызвавшую asyncio.sleep функцию может произойти только из потока событий и только при условии, что поток событий не вернёт управление какой-то другой задаче.

    Например, пусть есть функция, которая делает asyncio.sleep(1), затем три секунды работает числомолотилка без ввода-вывода. Тогда если у нас выполняются подряд с интервалами 0.1 с три таких функции, то первая задержит на 2.9 секунд возврат управления второй, а вторая - на 5.8 с третьей.

    Это общий принцип, разумеется, там много нюансов и особенностей реализации.
    Ответ написан
    Комментировать
  • Как работает asyncio.sleep?

    Vindicar
    @Vindicar
    RTFM!
    Идея простая.
    Асинхронные приложения - это набор пар "операция - обработчик", где операция - это некоторый длительный процесс (скажем, вводы/вывод), который не требует постоянного внимания со стороны кода. Когда операция завершается, выполняется её обработчик. Этот обработчик может планировать другие операции, и так далее.

    Корутины - это такие функции, которые умеют сохранять своё состояние, и восстанавливать его. Т.е. когда корутина делает await-вызов, она начинает длительную операцию, а обработчик этой операции просто восстанавливает контекст корутины и продолжает её выполнение.

    Соответственно, await-вызов сохраняет текущий контекст корутины, и планирует новую длительную операцию. Какую - зависит от того, что идёт после await. Эта операция представлена тем или иными awiatable значением (Future, Task и т.п.).

    Рабочий цикл (loop, его также называют реактор) просто проверяет текущие операции. Как только одна из них завершилась, он выполняет её обработчик. А потом продолжает проверять остальные активные операции.

    Ключевой момент - выполняет обработчик, а только потом проверяет остальные операции. Т.е. если обработчик планирует операцию через await - это не проблема, она будет выполняться наравне с остальными. А вот если обработчик просто делает что-то длительное, он не возвращает управление циклу, и не даёт выполняться остальным операциям.

    asyncio.sleep() планирует ничего не делающую операцию, которая завершится успехом через заданное время. Поэтому её выполнение не мешает циклу-реактору. Просто ещё один await вызов, который приостанавливает текущую корутину и возвращает управление реактору.

    time.sleep() ничего не знает о реакторе и асинхронных операциях. Она приостанавливает выполнение обработчика, не прерывая его и не отдавая контроль реактору. Поэтому на время time.sleep() (или любой длительной синхронной операции) спит вся программа.
    Ответ написан
    5 комментариев
  • Стоит ли переписывать старый проект на .NET6 (на голом энтузиазме)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Бизнес должен понимать что вы ему предлагаете. По сути эту идею можно продвинуть только под соусом разработки новой фичи. В противном случае у вас будет сильное непонимание. Все что вы предлагаете - это NFR. Не-функциональные требования. Шестая версия дотнет. Асинки. Обжекты. Бизнес не понимает как ему это дальше продавать.

    Я-бы сказал что просто так взять всё и переписать - это гиблое дело. Пойдут баги и бизнес попросит либо срочно исправлять либо откатить это назад до старой версии. Это - фиаско. Очень часто бывает так что старый и плохой код завязывается на какое-то странное поведение API которое плохо документировано и чёрт-пойми-как-работает. Но работает. Я много таких аномалий видел. И ты его исправляешь по фень-шую как должно быть и становится ... (!) еще хуже. Особенно большая беда с мультипоточкой и интеграцией например с операционкой или сторонними нативными либами.

    Если вы имеете силы и смелость - то пишите план (желательно на пол-года) на рефакторинг. Шаг-за шагом. Сначала - покрытие всего тестами. Потом миграция версий тоже мелкими шажками. И все это (!) параллельно с разработкой новой фичи которую бизнес одобрит. Только так.
    Ответ написан
    Комментировать
  • Как узнать какая программа отослала пакеты данных?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Смотреть командой netstat, она выведет все текущие соединения. Там и найдёте этот IP. Если сидите на Windows, то netstat -o (на Unix-like: netstat -p), с выводом PID того процесса, который соединение открыл. Найдёте нужный PID нужного соединения в диспетчере задач - вот и узнаете имя программы...
    Ответ написан
    3 комментария
  • Можно ли узнать возврат функции при использовании многопоточности Thread на Python?

    @Elick Автор вопроса
    from threading import Thread
    
    class ThreadWithResult(Thread):
        def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None):
            def function():
                self.result = target(*args, **kwargs)
            super().__init__(group=group, target=function, name=name, daemon=daemon)
    
    def sum_(x, y):
        time.sleep(2)
        return x + y
    
    def mul_(x, y):
        time.sleep(2)
        print(x*y)
    
    x = 5
    y = 4
    
    t1 = ThreadWithResult(target=sum_, args=(x,y))
    t2 = Thread(target=mul_, args=(x,y))
    
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(t1.result)
    Ответ написан
    1 комментарий
  • Что делать с папкой windows, которая весит около 60 Гб?

    Adler_lug
    @Adler_lug
    Запустите в консоли под админом
    Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore

    Это покажет размер хранилища компонентов.
    А очистить лишнее можно командой
    Dism.exe /online /Cleanup-Image /StartComponentCleanup
    Ответ написан
    Комментировать
  • Приделывать Git на сайт это хорошо?

    git - это система контроля версий.
    Это не "локальное хранилище" и не нечто, что можно "приделать" сбоку.

    Предположу, что под словом "приделать" вы имеете в виду использование git для доставки обновлений на продуктивный сервер.
    Моё мнение - так делать не стоит.
    Серверу совершенно не нужно хранить у себя всю историю версий.

    А вот локально да - лучше вести разработку в git.
    Ещё по хорошему следует хранить копию репозитория на каком-нибудь ещё сервере, например в собственном экземпляре gitlab и синхронизировать её с локальной при помощи git pull/push.

    Ну и помни, что не надо все файлы в git запихивать. В git должны храниться только исходные файлы. Всякие картинки - в git-lfs.
    Пароли - в каком-то другом хранилище.
    Артефакты, которые создаёт компилятор или препроцессор - в .gitignore
    Ответ написан
    1 комментарий
  • Как исправить ошибку [SSL: CERTIFICATE_VERIFY_FAILED]?

    CityCat4
    @CityCat4 Куратор тега Цифровые сертификаты
    //COPY01 EXEC PGM=IEBGENER
    Если сертификат самоподписанный - поместить его в хранилище доверенных корневых сертификатов. Если выдавался корпоративным CA - поместить в хранилище довереных сертификат этого СА.
    Можно отключить проверку - для отладки - но в проде так делать не рекомендуется - сейчас ооочень любят делать MitM все кому не лень.
    Ответ написан
    5 комментариев
  • Что должен уметь делать Python разработчик?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Не перестают удивлять меня такие вопросы. Каждый день вы имеете дело с результатами труда разработчиков. Включаете компьютер, у него в железе крутятся прошивки, написанные кем-то, загружается операционная система, написанная кем-то, вы открываете браузер, написанный кем-то, взаимодействуете с фронтом qna.habr.com, написанным кем-то, который шлёт web-серверу, написанному кем-то, запрос к бэкенду qna.habr.com, написанному кем-то, который работает с брокерами, кэшами, СУБД и прочим-прочим, написанным кем-то. Вот уметь написать всё это и должен разработчик неважно на чём. Когда я начинал, я постоянно задавался вопросами "Как это устроено? Смогу я написать такое же? Что надо, чтобы смог?", поэтому мне не нужно было ни у кого спрашивать, что изучать.
    Ответ написан
    Комментировать
  • Что должен уметь делать Python разработчик?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Должен уметь делать то же самое, что и любой не питон-разработчик ПО. ЯП - лишь инструмент. Программирование и разработка ПО - проектирование и реализация алгоритмов в рамках требований задачи и возможностей используемых инструментов.
    Ответ написан
    Комментировать
  • Возможно ли использование телефонного кабеля вместо сетевого?

    @TheBigBear
    СтарОдмины мы
    много лет назад пара VDSL2 конвертеров (модемов) Planet у меня держала 30 Мбит на 600 метров на обычной полёвке (кабель такой телефонный) кинутой вдоль силовых кабелей
    А на 50 метрах 100 Мбит - легко
    Найти на Авито пару VDSL2-конвертеров сейчас несложно
    Но если объекты в прямой видимости - сейчас проще всего WiFi мост с направленными антеннами. Правильное оборудование пробивает до 11 километров, так что 40 метров - это ни о чём.
    И сразу рекомендую ставить 5 ГГц (2.4 уже основательно засран, особенно в городе)
    Ответ написан
    Комментировать
  • Предложения по лицензированию ПО на ВМ?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Сделайте плавающую лицензию.
    Примерный алгоритм

    1. Вычисление хэша матери проца и дисков отправка к вам на сервер и ввод логина и пароля.
    2. если хэши совпадают то просто запуск, но тут главное первый запрос на сервер

    В итоге программа запускается в 1 экземпляре, если вторая машина регистрируется то все остальные билеты протухают
    Ответ написан
    Комментировать
  • Как правильно работать с секретами?

    Прокидывай секреты через переменные среды. Благо по умолчанию IConfiguration умеет работать со слоёными конфигами, где по порядку применяются следующие слои:
    1. appsettings.json
    2. appsettings.Environment.json
    3. переменные среды
    4. аргументы командной строки

    Соответственно никакие трансформации не нужны - можно спокойно пушить конфиг в репозиторий, заменяя секреты какими-нибудь заглушками (например мы туда кладём строки, которые похожи на тот секрет, который должен быть)

    Локально (на машине разработчика) переменные среды можно хранить в .env файлах, либо можно продолжать иметь дополнительные appsettings - это тоже ок.

    При разворачивании образа, повторюсь, прокидывай секреты в переменные среды.

    Так делают почти все, и все оркестраторы умеют с этим работать и прокидывать в переменные среды контейнера значения из каких-нибудь файлов или даже из хранилища секретов типа vault.
    Ответ написан
  • Как массово скачать файлы по списку?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    Т.е. не получится это сделать с помощью wget в командной строке, т.к. куков не будет

    Кто сказал?
    https://qna.habr.com/q/444245
    wget --no-check-certificate --quiet \
      --method GET \
      --timeout=0 \
      --header 'Cookie: PHPSESSID=ocqfdbv0kv6qs5jv4at6uk36pf' \
       'https://test-mis.ru/api/****************************************'
    Ответ написан
    Комментировать
  • Что возвращает return в С++?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    В данном конкретном случае, сработает оптимизация RVO - лишних копирований не произойдет.
    Ответ написан
    Комментировать
  • Что возвращает return в С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Зависит от кода функции и опций компилятора.

    Советую всем программистам на C++ хотябы почитать про ассемблер.
    Стек, регистры, вот это вот все. Тогда станет понятно, как работает процессор.

    Тогда станет понятно что "сам объект tmp" никак не вернуть. Это локальная переменная, лежащая на стеке в части, которая будет отброшена при выходе из функции. Отсюда вытекает, что вообще говоря, там должна быть копия.

    Но есть такая оптимизация, как RVO. В стандарте даже прописано, когда конкретно она гарантирована. Тогда копии не происходит. При этом компилятор вообще не создает локальной переменной. А вместо этого сразу же работает с тем местом, куда надо будет возвращать значение.

    Если код и включенные оптимизации позволяют это сделать - то копии не будет. Но в общем случае - будет копия.
    Ответ написан
    Комментировать
  • Почему при вызове return вызывается конструктор копирования, а не перегрузка оператора =?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    coffeeMachine mix = device + machine;
    вызывает перегрузку конструктора копирования, а не перегрузку оператор =, почему?

    Потому что ты создаёшь здесь экземпляр класса, это делается конструктором. Поскольку ты хочешь его инициализировать другим экземпляром, используется конструктор копирования. Дело в том, что оператор = ожидает слева сконструированный объект, а в данной записи его нет.

    А если написать вот так:
    coffeeMachine mix; mix = device + machine;
    то ты сначала создаёшь экземпляр со значением по умолчанию, а потом вызываешь оператор =.
    Ответ написан
    Комментировать