Find tmux session that a PID belongs to

前端 未结 3 1505
眼角桃花
眼角桃花 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: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.

提交回复
热议问题