Find tmux session that a PID belongs to

本秂侑毒 提交于 2019-12-12 08:05:54

问题


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?


回答1:


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.




回答2:


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)




回答3:


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.



来源:https://stackoverflow.com/questions/29439835/find-tmux-session-that-a-pid-belongs-to

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!