От последней версии уничтожения (2) страница справочника:
Чтобы процесс имел разрешение отправить сигнал в процесс, определяемый pid, пользователь должен быть суперпользователем, или идентификатор реального или сохраненного пользователя процесса получения должен соответствовать реальному или эффективному идентификатору пользователя процесса отправки. Единственным исключением является сигнал SIGCONT, который может всегда отправляться в любой процесс с тем же идентификатором сессии как отправитель. Кроме того, если безопасность bsd.conservative_signals sysctl установлена на 1, пользователь не является суперпользователем, и получатель установлен-uid, то только управление заданиями и терминальные сигналы управления могут быть отправлены (в частности, только SIGKILL, SIGINT, SIGTERM, SIGALRM, SIGSTOP, SIGTTIN, SIGTTOU, SIGTSTP, SIGHUP, SIGUSR1, SIGUSR2).
В каком смысле Вы владеете процессом? Каково точно состояние процесса, касающегося реального uid, эффективного uid, какой двоичный файл это выполняет, владелец и setid-биты того двоичного файла, и т.д.?
Название сессии хранится в tmux переменной #S
, для доступа к нему в терминале можно сделать
tmux display-message -p "#S"
Если Вы хотите использовать его в .tmux.conf
, это просто #S
. Обратите внимание что -p
опция распечатает сообщение на stdout, иначе сообщение отображено в tmux строке состояния.
Если вышеупомянутую команду называют в сессии, она возвращает название сессии. Если это называют вне какой-либо сессии, это все еще возвращает название последней все еще рабочей сессии. Я не мог найти, что команда tmux проверила, если Вы в сессии или нет, таким образом, я должен был придумать эту работу вокруг:
tmux list-sessions | sed -n '/(attached)/s/:.*//p'
tmux list-sessions
шоу все сессии, если Вы присоединяетесь, это показывает (attached)
в конце. С sed мы подавляем весь вывод (опция -n
) кроме того, где мы находим ключевое слово (attached)
, в этой строке мы срезаем everyhing после a :
, который оставляет нас с названием сессии. Это работает на меня внутри и снаружи сессии, в противоположность tmux display-message -p "#S"
.
Конечно, это работает, только если существует нет :
и нет (attached)
от имени сессии.
Как прокомментировано Chris Johnsen, способ проверить, ли Вы в tmux сессии, состоит в том, чтобы видеть, установлена ли ее переменная среды:
[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Взгляните здесь, с помощью этого сообщения, я понял, что одна вещь, которая различает 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', но в нем говорит 'экран'. Однако я нахожу первый путь намного лучше.
Вот сценарий жемчуга; при создании этого функция сценария оболочки или сценария оболочки является осуществлением, оставленным читателю.
#!/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
операторы и просто используют код выхода, если Вы хотите использовать это в сценарии оболочки или чем-то.
tmux
сессия и в другом я внеtmux
сессия. Когда я ввожу в них обоих командуtmux display-message -p "#S"
, тот же результат печатается, и возвращаемое значение обеих команд является тем же. – e271p314 29.01.2014, 15:33[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
– Chris Johnsen 30.01.2014, 09:40