Найти сеанс tmux, к которому относится PID

Я использую htop, чтобы посмотреть, какие процессы занимают много памяти, чтобы я мог их убить. У меня много сеансов tmux и много похожих процессов. Как я могу проверить, в какой панели tmux находится PID, чтобы быть уверенным, что я убиваю то, что хочу убить?

3 ответа

Решение

При условии PID в строке ниже находится номер целевого pid:

$ tmux list-panes -a -F "#{pane_pid} #{pane_id}" | grep ^PID

Вышеуказанное будет определять область, в которой PID бежит. На выходе будет две строки. Первый номер должен быть таким же, как PID а второй (со знаком процента) - "идентификатор панели tmux". Пример вывода:

2345 %30

Теперь вы можете использовать "tmux pane id", чтобы убить панель без "ручного" поиска:

$ tmux kill-pane -t %30


Чтобы полностью ответить на ваш вопрос, чтобы найти *tmux session *, которому принадлежит PID, можно использовать эту команду:

$ tmux list-panes -a -F "#{pane_pid} #{session_name}" | grep ^PID
# example output: 2345 development

Вот еще одна, возможно, полезная "строка":

$ tmux list-panes -a -F "#{pane_pid} #{session_name}:#{window_index}:#{pane_index}" | grep ^PID
# example output: 2345 development:2:0

Описания для всех строк интерполяции (пример #{pane_pid}) можно посмотреть в справочной странице tmux в FORMATS раздел.

Ответы выше дают вам капсулы снарядов, бегущих по панелям, вам не повезет, если вы захотите найти что-то, бегущее в снарядах.

пытаться:

https://gist.github.com/nkh/0dfa8bf165a53832a4b5b17ee0d7ab12

Этот скрипт дает вам все pids, а также файлы, которые открыли процессы. Я никогда не знаю, в каком сеансе, окне, панели, присоединен или нет, у меня открыт файл, это помогает.

Я не пробовал это на другой машине, скажите мне, если у вас возникнут какие-либо проблемы.

lsof должен быть установлен.

если вам нужны pids, pstree полезен, вы можете изменить скрипт, чтобы он использовался (он уже там прокомментирован)

Следующий скрипт отображает дерево процессов в каждом окне (или панели). Он принимает список PID в качестве одного параметра (один PID на строку). Указанные процессы подчеркнуты. Это автоматически трубы к less разве что является частью какой-то другой трубы. Пример:

$ ./tmux-processes.sh "$(pgrep ruby)"
-- session-name-1 window-index-1 window-name-1
         7184  7170 bash            bash --rcfile /dev/fd/63 -i
         7204  7184   vim             vim ...
-- session-name-2 window-index-2 window-name-2
         7186  7170 bash            bash --rcfile /dev/fd/63 -i
        10771  7186   bash            bash ./manage.sh runserver
        10775 10771     django-admi     /srv/www/s1/env/bin/python /srv/www/s1/env/bin/...
         5761 10775       python          /srv/www/s1/env/bin/python /srv/www/s1/env/bin/...
...

tmux-processes.sh:

#!/usr/bin/env bash
set -eu

pids=$1

my_pid=$$
subtree_pids() {
    local pid=$1 level=${2:-0}
    if [ "$pid" = "$my_pid" ]; then
        return
    fi
    echo "$pid"
    ps --ppid "$pid" -o pid= | while read -r pid; do
        subtree_pids "$pid" $((level + 1))
    done
}

# server_pid=$(tmux display-message -p '#{pid}')
underline=$(tput smul)
# reset=$(tput sgr0)   # produces extra symbols in less (^O), TERM=screen-256color (under tmux)
reset=$(echo -e '\033[m')
re=$(echo "$pids" | paste -sd'|')
tmux list-panes -aF '#{session_name} #{window_index} #{window_name} #{pane_pid}' \
| while read -r session_name window_index window_name pane_pid; do
    echo "-- $session_name $window_index $window_name"
    ps -p "$(subtree_pids "$pane_pid" | paste -sd,)" -Ho pid=,ppid=,comm=,args= \
        | sed -E 's/^/        /' \
        | awk \
        -v re="$re" -v underline="$underline" -v reset="$reset" '
            $1 ~ re {print underline $0 reset}
            $1 !~ re {print $0}
        '
done | {
    [ -t 1 ] && less -S || cat
}

Подробности относительно листинга tmux процессы вы можете найти здесь.

Чтобы подчеркнуть линии, я использую escape-последовательности ANSI. Чтобы показать идею отдельно, вот скрипт, который отображает список процессов и подчеркивает некоторые из них (передавая PID в качестве аргумента):

#!/usr/bin/env bash
set -eu
pids=$1

bold=$(tput bold)
# reset=$(tput sgr0)   # produces extra symbols in less (^O), TERM=xterm-256color              
reset=$(echo -e '\033[m')
underline=$(tput smul)
re=$(echo "$pids" | paste -sd'|')
ps -eHo pid,ppid,comm,args | awk \
-v re="$re" -v bold="$bold" -v reset="$reset" -v underline="$underline" '
    $1 ~ re {print underline $0 reset}
    $1 !~ re {print $0}
'

Использование:

$ ./ps.sh "$(pgrep ruby)"

Подробности относительно less а также $(tput sgr0) можно найти здесь.

Другие вопросы по тегам