Способ работы TMUX(1)
заключается в том, что клиентский процесс (tmux
) подключается к серверному процессу (тоже tmux
, но не подключен к TTY), как показано в следующем выводе ps
:
PID TTY STAT TIME COMMAND
19229 pts/1 S+ 0:00 tmux
19231 ? Ss 0:00 tmux
Это показывает, что клиент фактически запускается раньше сервера (можно предположить, что он его разветвляет).
После отсоединения/повторного подключения та же самая команда ps
выводит:
PID TTY STAT TIME COMMAND
19231 ? Ss 0:00 tmux
19290 pts/1 S+ 0:00 tmux attach
Это показывает клиент tmux как tmux attach
, поэтому его немного легче понять.
Теперь, если мы посмотрим на вывод pstree
в обоих вышеупомянутых случаях, мы получим в обоих случаях (игнорируя изменение pid
для tmux attach
):
pstree -p
init(1)─┬─acpid(1824)
├─cron(1859)
⋮
├─sh(14146)───tmux(19229)
└─tmux(19231)───sh(19233)───pstree(19234)
Четко видно, что команды, введенные (в данном случае pstree
) в клиентском процессе (PID 19229
), выполняются серверным (PID 19231
), что позволяет им продолжаться без SIGHUP в случае потери клиентского терминала (например, через ssh).
Теперь к вопросу, заданному ОП: что происходит в случае, когда tmux
возвращает failed to connect to server: Connection refused
, так это то, что серверный процесс (в нашем случае pid 19231) недоступен по какой-либо причине (это может быть из-за того, что серверный процесс умер; но также и потому, что пользователь выполнение клиента tmux
не имеет прав доступа к сокету tmux и т. д.)
Решение в этом случае состоит в том, чтобы использовать grep
для процессов tmux
(например, через ps
) и молиться, чтобы вы не получили эту ошибку, потому что сервер умер (так что вы можете подключиться к нему, используя lsof
, чтобы получить, какие сокеты он слушает ). В противном случае нет возможности присоединиться к серверу, так как он мертв как после перезагрузки.
TL;DR:
Эта ошибка может быть вызвана несколькими причинами, начиная от ошибки и заканчивая критическим сбоем (программа умерла). Короче говоря, используйте имеющиеся в вашем распоряжении инструменты UNIX, чтобы определить, какой сокет использует tmux
, если он все еще работает (должно быть как минимум два процесса, если у вас запущен клиент tmux — это происходит после вызова tmux
или tmux attach
из оболочки). ) и, следовательно, если вы потеряли сеанс или нет.
Примечание: как указывалось в других ответах, если причиной отображения этой ошибки является ошибка сокета, вы можете использовать флаг -L
, чтобы указать tmux
использовать определенный сокет.
person
7heo.tk
schedule
13.05.2015