Почему PPID tmux равен 1 в Ubuntu?

Почему PPID tmux равен 1 в Ubuntu?

Фон:

  • Подключитесь к серверу Ubuntu через ssh
  • Запустить tmux и отсоединить

Почему PPID tmux равен 1? Есть ли информация о механизме выполнения tmux?

решение1

tmuxработает в архитектуре клиент-сервер. Всякий раз, когда вы запускаете tmuxиз оболочки, вы запускаете клиента, который является потомком оболочки. (Возможно запустить tmuxиз не-оболочки, например, напрямую из sshd, эта деталь ничего не меняет).

tmuxклиент пытается найти tmuxсервер, связанный с вашим пользователем. Если сервер не найден, иногда клиент жалуется (например, tmux attach-session), а иногда он запускает сервер (например, sole tmux, что эквивалентно tmux new-session), а затем выполняет свою работу.

Задача любого tmuxклиента — поговорить с сервером и заставить его что-то сделать.

Когда tmuxнужно запустить сервер, он делает это clone(2)сам. Полученный дочерний процесс немедленно clones снова и затем завершается. Самый новый процесс становится фактическим tmuxсервером иего PPID равен 1, поскольку его родитель умер. Похоже, единственная задача промежуточного процесса — «отсоединить» сервер от его предков.

Я думаю, это может работать с tmuxсервером, являющимся непосредственным потомком какого-то tmuxклиента, а затем получающим PPID 1 только после того, как клиент умирает. Обратите внимание, что весь смысл в tmuxтом, чтобы иметь сервер, который продолжает работать после того, как исходный клиент отсоединяется; так что если сервер был потомком какого-то клиента, он, скорее всего, рано или поздно станет сиротой. И поскольку в целом tmuxклиент может быть запущен из любой оболочки или другого процесса, который может попытаться отслеживать потомков своих потомков, посылать им сигналы и т. д., сиротство сервера как можно скорее является разумным решением.

Таким образом, сервер почти сразу получает PPID 1. Каждая оболочка или другой процесс, который вы запускаете внутри, tmuxявляется потомком сервера. После (повторного) присоединения вы видите то, что показывает вам клиент. Сам клиент является потомком оболочки, в которой вы его вызвали (или sshdчего-то еще). Он общается с сервером, передает ему нажатия клавиш, получает информацию о том, как должно выглядеть окно, и выводит символы соответствующим образом.

Сервер, будучи запущенным, работает до тех пор, пока все сеансы внутри не будут завершены. Это означает, что для его корректного завершения вам необходимо завершить все оболочки (или другие процессы), являющиеся панелями.

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

Связанный контент