Find tmux session that a PID belongs to

2020-06-03 05:06发布

I am using htop so see what processes are taking up a lot of memory so I can kill them. I have a lot of tmux sessions and lots of similar processes. How can I check which tmux pane a PID is in so I can be sure I am killing stuff I want to kill?

标签: pid tmux htop
3条回答
啃猪蹄的小仙女
2楼-- · 2020-06-03 05:11

Given that PID in the below line is the target pid number:

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

The above will identify the pane where the PID is running. The output will be two strings. The first number should be the same as PID and the second one (with a percent sign) is "tmux pane id". Example output:

2345 %30

Now, you can use "tmux pane id" to kill the pane without "manually" searching for it:

$ tmux kill-pane -t %30


To answer your question completely, in order to find *tmux session* that a PID belongs to, this command can be used:

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

Here's another possibly useful "line":

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

The descriptions for all of the interpolation strings (example #{pane_pid}) can be looked up in tmux man page in the FORMATS section.

查看更多
3楼-- · 2020-06-03 05:11

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.

查看更多
Explosion°爆炸
4楼-- · 2020-06-03 05:31

The answers above give you the pids of the shells running in the panes, you'll be out of luck if you want to find something running in the shells.

try:

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

This scrip gives you all the pids as well as the files the processes have opened. I never know in which session, window, pane, attached or not, I have a file open, this helps.

I haven't tried it on another machine, tell me if you encounter any problem.

lsof needs to be installed.

if you just want pids, pstree is useful, you can modity the script to use it (it's already there commented)

enter image description here

查看更多
登录 后发表回答