5

Запись в списке доступных переменных на странице руководства tmux для pane_pid выглядит следующим образом:

pane_pid PID of first process in pane

Однако, согласно Run или отправке команды на панель tmux в запущенном сеансе tmux, «tmux не предоставляет способ добавления дополнительных процессов на панель после запуска ее начальной командой».

Итак ... что значит вернуть PID первого процесса панели? Разумно ли предположить, что это один-единственный PID панели, или для панели действительно есть несколько способов иметь несколько связанных PID?

3 ответа3

3

PID, возвращаемый pane_pid , обычно является PID команды, указанной при открытии окна (или оболочки, которая была открыта, когда не была указана команда).

Однако важно отметить, что при указании таких команд, как top; bash -i , tmux ставит перед командой bash -c (т. е. фактической командой, выполняемой при создании панели, является bash -c top; bash -i). В этом случае PID - это процесс bash -c , а не top .

Таким образом, в некотором смысле "первый процесс" панели - это единственный процесс панели, но это не обязательно процесс, связанный непосредственно с указанной командой.

1

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

Изменить: При запуске нового задания (пример: split-window -h "top") tmux порождает top в новой панели, и процесс top называется pane_pid. При запуске нескольких заданий в новой панели (например, что-то вроде split-window -h "top; tail -F /var /log /maillog"), tmux порождает неинтерактивную оболочку для управления заданиями. Эта оболочка, очевидно, получает pane_pid, а не первый процесс ("top" во втором примере).

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

Кстати, все это похоже на обычное поведение терминала Linux. Когда вы впервые входите в свой терминал, вы получаете процесс bash (или другую оболочку, указанную в вашем пользовательском файле), который был порожден процессом входа в систему. Если вы войдете в tty1 и tty2 одновременно, вы получите оболочку для каждого. Запустите ps -u, и вы увидите, что процесс оболочки работает и на каком терминале он запущен (tty1, tty2 и т.д.). Если вы убьете процесс оболочки, скажем, в tty2, вы выйдете из tty2. Но tty2 остается открытым, потому что ОС породила getty, чтобы оставить это открытым.

1

1) Из этого ответа

Не разделенные окна имеют одну панель

Итак, если вы начинаете новый сеанс tmux:

$ tmux

вы увидите оболочку, pane_pid = pid этой оболочки

так что если вы запускаете утилиту htop внутри оболочки

$ htop

тогда pane_pid также будет pid оболочки (первый процесс)

если вы запустите htop в новом окне

Press (Prefix :)
: new-window 'htop'

pane_pid = pid htop, если вы выйдете из htop, панель также закроется, но если вы используете команду респауна, например:

Press (Prefix :)  # for single pane window
: respawn-window -t session_name:window_index -k 'bash'
Or                # for multi-pane window  
: respawn-pane -t session_name:window_index.pane_index -k 'bash'

тогда pane_pid будет pid нового процесса (в данном случае bash)


2) Таким образом, каждая панель имеет один pane_pid, и этот pane_pid можно изменить только с помощью респауна.


Всё ещё ищете ответ? Посмотрите другие вопросы с метками .