我正在使用htop,所以看看哪些进程占用了大量内存,所以我可以杀死它们。我有很多tmux会话和许多类似的过程。如何查看PID所在的tmux窗格,以便确定我要杀死我要杀的东西?
答案 0 :(得分:10)
鉴于以下行中的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会话*,可以使用此命令:
$ 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
)的说明。
答案 1 :(得分:2)
上面的答案为你提供了在窗格中运行的shell的pid,如果你想找到在shell中运行的东西,你将会运气不好。
尝试:
https://gist.github.com/nkh/0dfa8bf165a53832a4b5b17ee0d7ab12
此脚本为您提供所有pid以及进程已打开的文件。我从来不知道在哪个会话,窗口,窗格,是否附加,我打开了一个文件,这有帮助。
我没有在另一台机器上试过,告诉我你是否遇到任何问题。
需要安装lsof。
如果你只是想要pids,pstree很有用,你可以修改脚本来使用它(已经有评论)
答案 2 :(得分:0)
The following script displays the tree of processes in each window (or pane). It takes list of PIDs as one parameter (one PID per line). Specified processes are underlined. It automatically pipes to less
unless is a part of some other pipe. Example:
$ ./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
}
Details regarding listing tmux
processes you can find here.
To underline lines I use ANSI escape sequences. To show the idea separately, here's a script that displays list of processes and underlines some of them (having PIDs passed as an argument):
#!/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}
'
Usage:
$ ./ps.sh "$(pgrep ruby)"
Details regarding less
and $(tput sgr0)
can be found here.