Если я запускаю tmux, а затем `убиваю `процесс tmux, я вижу два процесса bash. Как этот второй удар связан с первым и как его убить?

с помощьюsed:

sed -i 's/^User=Foo$/User=Bar/' /etc/systemd/service/myapp.*.service
1
22.10.2020, 02:24
1 ответ

Шаг 1 :запустить tmux

Изначально у вас открыт терминал, в котором запущен bash. Я назову это оригинальным bash.

Вы запускаете tmuxиз оригинального bash. Tmux запускает два процесса :сервер tmux и клиент tmux. Причина этого в том, что вы можете отсоединиться от сеанса tmux и снова подключиться к нему позже — это основная функция tmux. Клиент tmux подключается к терминалу, к которому подключен сеанс. Сервер запускает процессы, работающие в окнах tmux. Когда вы отключаетесь от сеанса (C-b d), клиент завершает работу, но сервер и процессы, запущенные в сеансе, продолжают работать. В дополнение к двум процессам tmux, если вы еще не запустили сеанс tmux, tmuxсоздает новый сеанс, содержащий одно окно, в котором он запускает вашу оболочку :, это второй bash.

На данный момент соответствующая часть дерева процессов выглядит так:

…
        ├─tmux: server───bash───pstree
        └─xterm───bash───tmux: client

Это из команды pstreeв Linux. Чтобы получить аналогичный дисплей в macOS, см.https://apple.stackexchange.com/questions/11770/linux-ps-f-tree-view-equivalent-on-osx. xterm— это терминал, на котором я запустил исходный bash, а tmux: client— клиент tmux, запущенный запуском tmuxв исходном bash. tmux: server— это сервер tmux, который запустил клиент tmux, а его дочерний bash— второй bash, с которого я запустил pstree.

В Linux вот вывод psвнутри tmux:

    PID TTY          TIME CMD
    108 pts/56   00:00:00 bash
    153 pts/56   00:00:00 ps

По умолчанию psLinux показывает только процессы, запущенные на текущем терминале. Вот почему я вижу. Во FreeBSD и, надеюсь, в macOS (я запускал это на машине с оболочкой zsh,вот почему он показывает zsh, а не bash):

19690  0  Is   0:00.36 /usr/local/bin/zsh
20046  0  I+   0:00.01 tmux: client (/tmp//tmux-1001/default) (tmux)
20049  1  Rs   0:00.06 /usr/local/bin/zsh
20138  1  R+   0:00.01 ps

Причина, по которой BSD psпоказывает больше процессов, заключается в том, что по умолчанию он показывает процессы, подключенные к любому терминалу. (Технический термин — это процессы, которые «имеют управляющий терминал». )Он не показывает процессы, которые вообще не подключены к терминалу, такие как сервер tmux.

Чтобы увидеть все задействованные процессы и получить больше информации об этих процессах, давайте запустим psс несколькими параметрами. Варианты просмотра соответствующих данных немного отличаются в разных вариантах Unix. Я покажу Linux и FreeBSD; macOS, вероятно, близка к FreeBSD, но может немного отличаться. В Linux вот вывод ps x -o pid,ppid,tty,comm f, отфильтрованный по соответствующим процессам:

    PID    PPID TT      COMMAND
    107       1 ?       tmux: server
    108     107 pts/1    \_ bash
    154     108 pts/1        \_ ps
      3       1 ?       xterm
      6       3 pts/0    \_ bash
    105       6 pts/0        \_ tmux: client

А во FreeBSD сps -U $(id -u) -A -o pid,ppid,tty,command -d(в macOS вам нужно будет удалить -d, и вы не сможете снова отфильтровать древовидное представление )(; во FreeBSD я вошел в систему удаленно, поэтому исходный zsh находится в терминале, предоставленномsshd):

  PID  PPID TTY   COMMAND
19689 19687 -     sshd: gilles@pts/0 (sshd)
19690 19689 pts/0 - /usr/local/bin/zsh
20046 19690 pts/0 `-- tmux: client (/tmp//tmux-1001/default) (tmux)
20048     1 -     tmux: server (/tmp//tmux-1001/default) (tmux)
20049 20048 pts/1 - /usr/local/bin/zsh
20149 20049 pts/1 `-- ps -U 1001 -A -o pid,ppid,tty,command -d

В обоих случаях вы видите шесть процессов:

  • Эмулятор терминала, предоставляющий pts/0.
  • Оригинальная оболочка, работающая в pts/0.
  • Клиент tmux, работающий в pts/0, запускался из оригинальной оболочки.
  • Сервер tmux. Он не работает в терминале. Его родителем(PPID)является процесс 1. (Это происходит потому, что когда клиент tmux запускает сервер, он дважды -разветвляется :, он создает дочерний процесс, который сам создает дочерний процесс, а затем немедленно завершает работу. Когда промежуточный процесс завершается, внук становится сиротой и поэтому усыновляется init , который является процессом 1.)
  • Оболочка, работающая внутри tmux. Он работает внутри единственного окна tmux, которое является терминалом pts/1.
  • psработает внутри оболочки внутри tmux.

Шаг 2 :убить tmux

Вы завершаете процесс tmux. Но какой?Мы видели выше, что их два. Мы также видели выше, что в macOS psбез параметров показывает все процессы, запущенные в терминале. Итак, вы увидели и убили клиент tmux. Это эквивалентно отсоединению от сеанса. Сервер tmux все еще работает. Это одна из причин использования tmux :, если клиент убит, например, потому что терминал, на котором работает клиент, уходит, а сеанс продолжает работать.

Шаг 3 :повторное подключение сеанса

Вы можете просмотреть существующий сеанс tmux с помощью tmux list-sessions. И вы можете снова подключиться к нему с помощью tmux attach. Если у вас несколько сеансов, вы можете выбрать, к какому из них подключиться, указав номер сеанса после tmux attach, например. tmux attach 0для подключения к сеансу, который tmux list-sessionsописывает как 0: 1 windows (created …) ….

Если вы хотите завершить сеанс, не подключаясь к нему, вы можете использовать tmux kill-session. Есть даже команда tmux kill-server, которая убивает все сессии.

Шаг 4 :нормальный выход

Когда вы нажимаете Ctrl+D или вводите exitв оболочке внутри tmux, оболочка закрывается. Когда основной процесс окна tmux завершается, tmux закрывает окно. Когда tmux закрывает последнее окно, сеанс завершается.

1
18.03.2021, 22:56

Теги

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