Nano Hash - криптовалюты, майнинг, программирование

Процесс, запущенный с помощью nohup, не отсоединен от родителя

У меня есть следующие упрощенные сценарии:

Питон test.py:

import subprocess, os


def run_background_process(script_name):
    with open(os.devnull, 'w') as FNULL:
        background_process = subprocess.Popen(['nohup', '{}'.format(script_name)], stdout=FNULL
                     , stderr=FNULL
                     , stdin=FNULL)

    return background_process

while True:
    run_background_process('test.sh')
    time.sleep(500)

Сценарий оболочки Bash test.sh:

#!/bin/bash

n=1

echo ${n}
sleep 30

И ps -ef результат:

15536 16555  0 14:18 test.py
15541 15536  0 14:18 test.sh

Итак, мой вопрос: почему test.sh не отделен от test.py и все еще является дочерним элементом test.py?


Ответы:


1

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

Использование nohup не нарушает эту связь. (Для этого дочерний процесс должен fork создать новый процесс и завершить себя, но это уже другая тема). Итак, первый ответ - да, ребенок все еще является ребенком своего родителя.

На другой вопрос трудно ответить прямо. Значение слова «отдельно» в вашем вопросе не очень четко определено. Я рекомендую ознакомиться с некоторыми руководствами о группах процессов (наборе процессов), управлении заданиями, управлении терминалом и сессиями (наборе групп процессов) в Unix/Linux.

Целью утилиты nohup является защита запущенного процесса от завершения при выходе из системы. Выходящая оболочка выполняет очистку и отправляет сигнал SIGHUP всем процессам, находящимся под ее контролем. Кроме того, используемое терминальное устройство (ввод с клавиатуры, вывод на экран) будет закрыто во время выхода из системы. nohup просто гарантирует, что SIGHUP игнорируется и терминал не используется. В результате соответствующий процесс может продолжать свою работу после выхода из системы.

05.03.2017
  • Я хочу сказать, что я хочу, чтобы ребенок продолжал выполнение, когда родитель убит. Этого не происходит в случае выше, если мы поместим вечный цикл в дочерний элемент, он все равно завершится, когда родитель будет убит. 05.03.2017
  • @CuriousGuy Может быть, вы убиваете родителя с помощью Ctrl-C? 05.03.2017
  • Да, теперь я понимаю, что это проблема... Ребенок будет жить, только если родитель выйдет нормально, верно? 05.03.2017
  • @CuriousGuy Ctrl-C отправляется всем процессам в группе процессов, включая дочерний. Убивается с помощью Ctrl-C. 05.03.2017
  • @CuriousGuy Я рад, что смог помочь. 05.03.2017
  • Ваш комментарий действительно заставил меня понять, как работают процессы, у меня было совершенно неправильное понимание. 05.03.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..