
Фон:
- Подключитесь к серверу 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)
сам. Полученный дочерний процесс немедленно clone
s снова и затем завершается. Самый новый процесс становится фактическим tmux
сервером иего PPID равен 1, поскольку его родитель умер. Похоже, единственная задача промежуточного процесса — «отсоединить» сервер от его предков.
Я думаю, это может работать с tmux
сервером, являющимся непосредственным потомком какого-то tmux
клиента, а затем получающим PPID 1 только после того, как клиент умирает. Обратите внимание, что весь смысл в tmux
том, чтобы иметь сервер, который продолжает работать после того, как исходный клиент отсоединяется; так что если сервер был потомком какого-то клиента, он, скорее всего, рано или поздно станет сиротой. И поскольку в целом tmux
клиент может быть запущен из любой оболочки или другого процесса, который может попытаться отслеживать потомков своих потомков, посылать им сигналы и т. д., сиротство сервера как можно скорее является разумным решением.
Таким образом, сервер почти сразу получает PPID 1. Каждая оболочка или другой процесс, который вы запускаете внутри, tmux
является потомком сервера. После (повторного) присоединения вы видите то, что показывает вам клиент. Сам клиент является потомком оболочки, в которой вы его вызвали (или sshd
чего-то еще). Он общается с сервером, передает ему нажатия клавиш, получает информацию о том, как должно выглядеть окно, и выводит символы соответствующим образом.
Сервер, будучи запущенным, работает до тех пор, пока все сеансы внутри не будут завершены. Это означает, что для его корректного завершения вам необходимо завершить все оболочки (или другие процессы), являющиеся панелями.
Эта архитектура объясняет, почему окружение первого вызванного tmux
может быть сохранено, но в целом окружение tmux
клиентов может не иметь значения. Сервер запускается как внук первого tmux
, поэтому он может наследовать окружение. После этого все зависит от сервера. Пока сервер работает, нет прямого наследования от любого последующего клиента, поскольку ни сервер, ни вновь порожденные процессы (панели) не являются потомками этого клиента. Смотритеэтот мой ответ.