15

我正在使用 htop 所以看看哪些进程占用了大量内存,以便我可以杀死它们。我有很多 tmux 会话和很多类似的过程。如何检查 PID 在哪个 tmux 窗格中,以便确定我正在杀死我想要杀死的东西?

4

3 回答 3

19

鉴于PID下一行是目标 pid 号:

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

以上将识别PID正在运行的窗格。输出将是两个字符串。第一个数字应该与第二个数字相同,PID第二个数字(带有百分号)是“tmux pane id”。示例输出:

2345 %30

现在,您可以使用“tmux pane id”来杀死窗格,而无需“手动”搜索它:

$ tmux kill-pane -t %30


要完全回答您的问题,为了找到 PID 所属的 *tmux session*,可以使用以下命令:

$ 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

于 2015-04-04T08:43:54.747 回答
2

上面的答案为您提供了在窗格中运行的 shell 的 pid,如果您想找到在 shell 中运行的东西,您将不走运。

尝试:

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

此脚本为您提供所有 pid 以及进程已打开的文件。我永远不知道在哪个会话、窗口、窗格中,是否已附加,我打开了一个文件,这有帮助。

我没有在另一台机器上尝试过,如果您遇到任何问题,请告诉我。

lsof 需要安装。

如果你只想要 pids,pstree 很有用,你可以修改脚本来使用它(它已经在那里评论了)

在此处输入图像描述

于 2016-10-13T21:29:55.380 回答
1

以下脚本显示每个窗口(或窗格)中的进程树。它将 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您可以在此处找到有关列出流程的详细信息。

为了下划线,我使用 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)可以在这里找到的详细信息。

于 2018-05-28T18:53:49.667 回答