Открытая программа как корень, закройте корневой сеанс, но все еще программа работает

Как обновление этого вопроса/ответа, поточная обработка станет более полезной в этих 5,2 выпусках, которые затем, предположительно, подадут заявки как mysql, выполненный быстрее.

Если Вы собираетесь выполнить bsd.mp ядро для многопроцессорных/многоядерных систем, даже если это не AMD, используйте платформу AMD64 вместо i386 платформы, поскольку это, кажется, преобладающая мудрость (от devs как Henning Brauer, ре: bsdtalk берут интервью с Peter Hansteen), на какой выполнения 'лучше' в многоядерных системах прямо сейчас.

2
14.05.2013, 02:00
4 ответа

Фоновые процессы обновлены до родительского процесса (на Linux обычно) init, PID 1.

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

root активно, пока Ваша система работает. (root как в суперпользователе.)

Во всяком случае это не имеет никакого отношения root пользователь по сути. Поскольку процесс, который Вы запустили, не зависит от терминала, (и т.п.), заканчивание родительского процесса не завершило бы ребенка. Это обычно становится висячей строкой в течение короткого времени, затем принятого init.

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

ps aux | awk 'NR>1{print $1}' | sort -u

Для иллюстрирования можно вместо этого использовать другую учетную запись, например. testuser.

sleeplong:

#!/bin/sh
sleep 9999

Сохраните и cmod +x sleeplong. Выполненный под testuser:

user@host $ su testuser
testuser@host $ ./sleeplong &
[1] 9692

Открытый top с PIDs:

user@host $ pids="$(pstree -cpsa 9692 | \
sed 's/ *[^,]*,\([0-9]*\).*/\1/' | tr '\n' ',')"; \
top -w 90 -p ${pids}1

Войдите V для получения дерева

  PID USER         TIME+  COMMAND
    1 root        0:01.03 init
19787 user       95:30.58  `- terminal
 8835 user        0:00.16      `- bash
 9634 testuser    0:00.04          `- su
 9642 testuser    0:00.09              `- bash
 9692 testuser    0:00.00                  `- sleeplong
 9693 testuser    0:00.00                      `- sleep

Выход:

testuser@host $ exit

Выполненная главная стандартная программа снова:

  PID USER       TIME+  COMMAND
    1 root      0:01.03 init
 9692 testuser  0:00.00  `- sleeplong
 9693 testuser  0:00.00      `- sleep

Можно визуализировать это далее путем выполнения чего-то вроде этого:

  1. Разверните сценарий до:

    #!/bin/sh
    sleep 8888 &
    sleep 9999
    ecode=$?
    
    printf "Bye\n"
    
    exit $ecode
    
  2. Выполните его ./sleeplong2 & (su или не).

  3. Запустить top с той же стандартной программой как выше и вводят c для показа аргументов.
  4. В другом терминале:

    kill NNN # Where NNN=PID of sleep 8888
    kill NNN # Where NNN=PID of sleep 9999
    

Код выхода от в последний раз kill должен обычно быть 143. Это

128 + 15 = 143

Как kill значения по умолчанию к 15, или SIGTERM.


Другая вещь испытать могла состоять в том, чтобы уничтожить удар (и т.п.) где sleep находиться.


Также не, что можно сделать, например:

$ su testuser -c './sleeplong &'

Надежда это стало немного более ясным.

1
27.01.2020, 22:06

Это и знак после команды truecrypt. Это заставляет truecrypt сессию работать в фоновом режиме. если Вы удалите и символ, то он закроется, когда окно терминала закроется.

Если требуется сохранить и, можно использовать fg команда для обеспечения сессии к переднему плану, после которого это должно согласиться с окном. Использовать jobs перечислять все задания в фоновом режиме, если у Вас есть больше чем один.

1
27.01.2020, 22:06
  • 1
    , очевидно, и является для выполненного этим на фоне. Вопрос состоит в том, почему он продолжает бежать, если он был запущен корнем, но корень больше не активен? –  eez0 13.05.2013, 21:14

Это дизайном.

Закрывание сеанса не закрывает все программы пользователя. Это дизайном. С одной стороны, у пользователя могли быть программы, работающие на других сессиях. Пользователь, возможно, также хотел поддерживать программу в рабочем состоянии в фоновом режиме, в то время как он не зарегистрирован ни на каком терминале (screen или tmux особенно популярно для этого).

То, что делает закрывание сеанса, примерно говорит для удаления выхода, посредством которого программы могут взаимодействовать с пользователем: на сессии текстового режима программы сказаны, что терминал исчез (SIGHUP); на сессии GUI программы сказаны, что X-сервер ушел. Большинство программ выходит при таких обстоятельствах.

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

Выходить из системы не собирается волшебно изменяться, какого пользователя процесс выполняет как. На что это, как предполагалось бы, изменилось бы так или иначе?

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

1
27.01.2020, 22:06

Я не могу проверить это от работы, но процесс truecrypt запускается как процесс демона так или иначе? Которым я имею в виду, процесс init с pid 1 родительский процесс процесса truecrypt?

Если это будет, то это не завершится при выходе из корневой оболочки потому что это не получает сигнал SIGHUP от того, чтобы выходить из системы.

0
27.01.2020, 22:06

Теги

Похожие вопросы