с помощьюsed
:
sed -i 's/^User=Foo$/User=Bar/' /etc/systemd/service/myapp.*.service
Изначально у вас открыт терминал, в котором запущен 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
По умолчанию ps
Linux показывает только процессы, запущенные на текущем терминале. Вот почему я вижу. Во 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
. pts/0
, запускался из оригинальной оболочки. PPID
)является процесс 1. (Это происходит потому, что когда клиент tmux запускает сервер, он дважды -разветвляется :, он создает дочерний процесс, который сам создает дочерний процесс, а затем немедленно завершает работу. Когда промежуточный процесс завершается, внук становится сиротой и поэтому усыновляется init , который является процессом 1.)pts/1
. ps
работает внутри оболочки внутри tmux. Вы завершаете процесс tmux. Но какой?Мы видели выше, что их два. Мы также видели выше, что в macOS ps
без параметров показывает все процессы, запущенные в терминале. Итак, вы увидели и убили клиент tmux. Это эквивалентно отсоединению от сеанса. Сервер tmux все еще работает. Это одна из причин использования tmux :, если клиент убит, например, потому что терминал, на котором работает клиент, уходит, а сеанс продолжает работать.
Вы можете просмотреть существующий сеанс tmux с помощью tmux list-sessions
. И вы можете снова подключиться к нему с помощью tmux attach
. Если у вас несколько сеансов, вы можете выбрать, к какому из них подключиться, указав номер сеанса после tmux attach
, например. tmux attach 0
для подключения к сеансу, который tmux list-sessions
описывает как 0: 1 windows (created …) …
.
Если вы хотите завершить сеанс, не подключаясь к нему, вы можете использовать tmux kill-session
. Есть даже команда tmux kill-server
, которая убивает все сессии.
Когда вы нажимаете Ctrl+D или вводите exit
в оболочке внутри tmux, оболочка закрывается. Когда основной процесс окна tmux завершается, tmux закрывает окно. Когда tmux закрывает последнее окно, сеанс завершается.