查找 PID 所属的 tmux 会话
Find tmux session that a PID belongs to
我正在使用 htop,所以看看哪些进程占用了大量内存,以便我可以杀死它们。我有很多 tmux 会话和很多类似的过程。我如何检查 PID 在哪个 tmux 窗格中,以便我可以确定我正在杀死我想杀死的东西?
鉴于下行中的PID
是目标pid号:
$ tmux list-panes -a -F "#{pane_pid} #{pane_id}" | grep ^PID
以上将识别 PID
为 运行 的窗格。输出将是两个字符串。第一个数字应与 PID
相同,第二个数字(带百分号)为 "tmux pane id"。示例输出:
2345 %30
现在,您可以使用 "tmux pane id" 关闭窗格而无需 "manually" 搜索它:
$ tmux kill-pane -t %30
要完整回答你的问题,为了找到一个PID所属的*tmux session*,可以使用这个命令:
$ tmux list-panes -a -F "#{pane_pid} #{session_name}" | grep ^PID
# example output: 2345 development
这是另一个可能有用的 "line":
$ tmux list-panes -a -F "#{pane_pid} #{session_name}:#{window_index}:#{pane_index}" | grep ^PID
# example output: 2345 development:2:0
可以在 tmux 手册页的 FORMATS
部分中查找所有插值字符串的描述(示例 #{pane_pid}
)。
上面的答案在窗格中为您提供了 shell 运行 的 pids,如果您想在 shell 中找到某些东西 运行,您将不走运。
尝试:
https://gist.github.com/nkh/0dfa8bf165a53832a4b5b17ee0d7ab12
这个脚本给你所有的 pids 以及进程打开的文件。我不知道在哪个会话中,window,窗格,附加与否,我打开了一个文件,这有帮助。
我没在别的机器上试过,有什么问题请告诉我。
需要安装lsof。
如果你只是想要 pids,pstree 很有用,你可以修改脚本来使用它(它已经被评论了)
以下脚本显示每个 window(或窗格)中的进程树。它将 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=
my_pid=$$
subtree_pids() {
local pid= 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 '3[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" '
~ re {print underline [=11=] reset}
!~ re {print [=11=]}
'
done | {
[ -t 1 ] && less -S || cat
}
有关列出 tmux
进程的详细信息,您可以找到 here。
为了给线条加下划线,我使用了 ANSI 转义序列。为了单独展示这个想法,这里有一个显示进程列表并在其中一些下划线的脚本(将 PID 作为参数传递):
#!/usr/bin/env bash
set -eu
pids=
bold=$(tput bold)
# reset=$(tput sgr0) # produces extra symbols in less (^O), TERM=xterm-256color
reset=$(echo -e '3[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" '
~ re {print underline [=12=] reset}
!~ re {print [=12=]}
'
用法:
$ ./ps.sh "$(pgrep ruby)"
有关 less
和 $(tput sgr0)
的详细信息,请参见 here。
我正在使用 htop,所以看看哪些进程占用了大量内存,以便我可以杀死它们。我有很多 tmux 会话和很多类似的过程。我如何检查 PID 在哪个 tmux 窗格中,以便我可以确定我正在杀死我想杀死的东西?
鉴于下行中的PID
是目标pid号:
$ tmux list-panes -a -F "#{pane_pid} #{pane_id}" | grep ^PID
以上将识别 PID
为 运行 的窗格。输出将是两个字符串。第一个数字应与 PID
相同,第二个数字(带百分号)为 "tmux pane id"。示例输出:
2345 %30
现在,您可以使用 "tmux pane id" 关闭窗格而无需 "manually" 搜索它:
$ tmux kill-pane -t %30
要完整回答你的问题,为了找到一个PID所属的*tmux session*,可以使用这个命令:
$ tmux list-panes -a -F "#{pane_pid} #{session_name}" | grep ^PID
# example output: 2345 development
这是另一个可能有用的 "line":
$ tmux list-panes -a -F "#{pane_pid} #{session_name}:#{window_index}:#{pane_index}" | grep ^PID
# example output: 2345 development:2:0
可以在 tmux 手册页的 FORMATS
部分中查找所有插值字符串的描述(示例 #{pane_pid}
)。
上面的答案在窗格中为您提供了 shell 运行 的 pids,如果您想在 shell 中找到某些东西 运行,您将不走运。
尝试:
https://gist.github.com/nkh/0dfa8bf165a53832a4b5b17ee0d7ab12
这个脚本给你所有的 pids 以及进程打开的文件。我不知道在哪个会话中,window,窗格,附加与否,我打开了一个文件,这有帮助。
我没在别的机器上试过,有什么问题请告诉我。
需要安装lsof。
如果你只是想要 pids,pstree 很有用,你可以修改脚本来使用它(它已经被评论了)
以下脚本显示每个 window(或窗格)中的进程树。它将 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=
my_pid=$$
subtree_pids() {
local pid= 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 '3[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" '
~ re {print underline [=11=] reset}
!~ re {print [=11=]}
'
done | {
[ -t 1 ] && less -S || cat
}
有关列出 tmux
进程的详细信息,您可以找到 here。
为了给线条加下划线,我使用了 ANSI 转义序列。为了单独展示这个想法,这里有一个显示进程列表并在其中一些下划线的脚本(将 PID 作为参数传递):
#!/usr/bin/env bash
set -eu
pids=
bold=$(tput bold)
# reset=$(tput sgr0) # produces extra symbols in less (^O), TERM=xterm-256color
reset=$(echo -e '3[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" '
~ re {print underline [=12=] reset}
!~ re {print [=12=]}
'
用法:
$ ./ps.sh "$(pgrep ruby)"
有关 less
和 $(tput sgr0)
的详细信息,请参见 here。