Find tmux session that a PID belongs to

前端 未结 3 1448
眼角桃花
眼角桃花 2021-02-03 10:16

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 p

相关标签:
3条回答
  • 2021-02-03 10:36

    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.

    0 讨论(0)
  • 2021-02-03 10:42

    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)

    0 讨论(0)
  • 2021-02-03 10:51

    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.

    0 讨论(0)
提交回复
热议问题