Как я знаю название tmux сессии?

От последней версии уничтожения (2) страница справочника:

Чтобы процесс имел разрешение отправить сигнал в процесс, определяемый pid, пользователь должен быть суперпользователем, или идентификатор реального или сохраненного пользователя процесса получения должен соответствовать реальному или эффективному идентификатору пользователя процесса отправки. Единственным исключением является сигнал SIGCONT, который может всегда отправляться в любой процесс с тем же идентификатором сессии как отправитель. Кроме того, если безопасность bsd.conservative_signals sysctl установлена на 1, пользователь не является суперпользователем, и получатель установлен-uid, то только управление заданиями и терминальные сигналы управления могут быть отправлены (в частности, только SIGKILL, SIGINT, SIGTERM, SIGALRM, SIGSTOP, SIGTTIN, SIGTTOU, SIGTSTP, SIGHUP, SIGUSR1, SIGUSR2).

В каком смысле Вы владеете процессом? Каково точно состояние процесса, касающегося реального uid, эффективного uid, какой двоичный файл это выполняет, владелец и setid-биты того двоичного файла, и т.д.?

12
13.05.2015, 16:23
3 ответа

Название сессии хранится в переменной #S, для доступа к нему в можно сделать

tmux display-message -p "#S"

Если Вы хотите использовать его в .tmux.conf, это просто #S. Обратите внимание что -p опция распечатает сообщение на stdout, иначе сообщение отображено в строке состояния.

Если вышеупомянутую команду называют в сессии, она возвращает название сессии. Если это называют вне какой-либо сессии, это все еще возвращает название последней все еще рабочей сессии. Я не мог найти, что команда проверила, если Вы в сессии или нет, таким образом, я должен был придумать эту работу вокруг:

tmux list-sessions | sed -n '/(attached)/s/:.*//p'

tmux list-sessions шоу все сессии, если Вы присоединяетесь, это показывает (attached) в конце. С мы подавляем весь вывод (опция -n) кроме того, где мы находим ключевое слово (attached), в этой строке мы срезаем everyhing после a :, который оставляет нас с названием сессии. Это работает на меня внутри и снаружи сессии, в противоположность tmux display-message -p "#S".

Конечно, это работает, только если существует нет : и нет (attached) от имени сессии.

Как прокомментировано Chris Johnsen, способ проверить, ли Вы в сессии, состоит в том, чтобы видеть, установлена ли ее переменная среды:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
16
27.01.2020, 19:55
  • 1
    Даже это выглядит корректным, я должен признать, что это не работало на меня. У меня есть две консоли, в одном я имею tmux сессия и в другом я вне tmux сессия. Когда я ввожу в них обоих команду tmux display-message -p "#S", тот же результат печатается, и возвращаемое значение обеих команд является тем же. –  e271p314 29.01.2014, 15:33
  • 2
    я вижу то же поведение. Посмотрите на мой обновленный ответ для работы вокруг. –  pfnuesel 29.01.2014, 19:51
  • 3
    Можно, вероятно, просто сойти с рук проверка переменную среды TMUX (она обычно устанавливается для процессов в сессии и не устанавливается вне сессии — это не “надежно”, так как что-то могло бы установить или сбросить TMUX и перепутать вещи, но это должно быть довольно надежно). В ksh, ударе, zsh, и так далее: [[ -n "${TMUX+set}" ]] && tmux display-message -p "#S" –  Chris Johnsen 30.01.2014, 09:40
  • 4
    Спасибо за комментарий. Это - действительно более изящный путь и достаточно устойчивый, я считаю. Я добавил Ваш комментарий в своем ответе. –  pfnuesel 30.01.2014, 13:18
  • 5
    Что, если я являюсь внутренним две tmux сессии с различными именами одновременно? Это работает? –  Mihai Danila 11.08.2016, 06:46

Взгляните здесь, с помощью этого сообщения, я понял, что одна вещь, которая различает tmux клиенты - их tty но имена сессии tmux свойство сервера и является тем же, когда мы смотрим на имя сессии изнутри или снаружи a tmux клиент. Затем, мы можем использовать tmux info | head который отображает pid и tty клиента и pid сервера.

tmux info | grep $$ | grep -q `ps -p $$ -o tty=`

Следующее возвращаемое значение команды 0, если мы внутри a tmux клиент или не нуль, если мы работаем снаружи a tmux клиент. При выполнении его из сценария удостоверьтесь, что Вы используете ppid вместо $$, так как tty связан с процессом оболочки не скрипт, который Вы запускаете.

Один простой способ, но менее устойчивый, чтобы знать, внутри или снаружи ли мы tmux клиент путем рассмотрения ТЕРМИНА переменная среды. Кажется, что вне клиента это говорит, что 'xterm', но в нем говорит 'экран'. Однако я нахожу первый путь намного лучше.

0
27.01.2020, 19:55

Вот сценарий жемчуга; при создании этого функция сценария оболочки или сценария оболочки является осуществлением, оставленным читателю.

#!/opt/local/bin/perl

use strict;
use warnings;

if (exists $ENV{'TMUX'}) {
    # session ID is the last element
    # /tmp/1s/ffkjhk76sdgn/T/tmux-771/default,16772,8
    my($id) = $ENV{'TMUX'};
    $id =~ s{^.*,(\d+)$}{$1};

    # get session name
    my($cmd) = q(tmux ls -F "#{session_name}: #{session_id}");
    open(IN, "$cmd |") || die qq([ERROR] Cannot open pipe from "$cmd" - $!\n);

    while (<IN>) {
        chomp;

        if (m{(^.*):\s+\$$id$}) {
            print "Session name: <$1>\n";
            exit 0;
        }
    }

    print "Unable to determine TMUX session name\n";
    exit 1;
}
else {
    print "Not in a TMUX session\n";

    exit 1;
}

Это производит следующий вывод на сессии TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

За пределами сессии TMUX это произвело бы следующее:

<~> $ tmuxsessionname
Not in a TMUX session

Можно угробить print операторы и просто используют код выхода, если Вы хотите использовать это в сценарии оболочки или чем-то.

0
27.01.2020, 19:55

Теги

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