【问题标题】:Find tmux session that a PID belongs to查找 PID 所属的 tmux 会话
【发布时间】:2015-06-08 23:52:46
【问题描述】:

我正在使用 htop,所以看看哪些进程占用了大量内存,以便我可以杀死它们。我有很多 tmux 会话和很多类似的过程。如何检查 PID 在哪个 tmux 窗格中,以便确定我正在杀死我想要杀死的东西?

【问题讨论】:

    标签: pid tmux htop


    【解决方案1】:

    鉴于下一行中的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 session*,可以使用以下命令:
    $ 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
    

    可以在 tmux 手册页的 FORMATS 部分中查找所有插值字符串的描述(例如 #{pane_pid})。

    【讨论】:

    • 我很困惑。接受的答案+赞成票表明这是可行的。然而,至少在 tmux 2.8 上,#{pane_pid} 是“窗格中第一个进程的 PID”,它将成为所有内容的外壳(即bash),除非有一种方法可以直接在窗格中生成程序而无需一个贝壳。
    • 这根本没有用,因为它只为您提供“bash”的 PID,而不是正在运行的实际命令。
    • 正在运行的命令的 pid 是该 bash 进程的子进程,因此使用 pstreepane_pid 你有你需要的东西
    【解决方案2】:

    上面的答案为您提供了在窗格中运行的 shell 的 pid,如果您想找到在 shell 中运行的东西,那么您将不走运。

    尝试:

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

    此脚本为您提供所有 pid 以及进程已打开的文件。我永远不知道在哪个会话、窗口、窗格中,是否已附加,我打开了一个文件,这有帮助。

    我没有在其他机器上尝试过,如果遇到任何问题,请告诉我。

    需要安装lsof。

    如果你只想要 pids,pstree 很有用,你可以修改脚本来使用它(它已经有注释)

    【讨论】:

      【解决方案3】:

      以下脚本显示每个窗口(或窗格)中的进程树。它将 PID 列表作为一个参数(每行一个 PID)。指定的过程带有下划线。它会自动通过管道连接到less,除非它是其他管道的一部分。示例:

      $ ./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
      }
      

      有关列出tmux 进程的详细信息,您可以找到here

      为了给行加下划线,我使用 ANSI 转义序列。为了单独展示这个想法,这是一个显示进程列表并在其中一些下划线的脚本(将 PID 作为参数传递):

      #!/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}
      '
      

      用法:

      $ ./ps.sh "$(pgrep ruby)"
      

      关于less$(tput sgr0)的详细信息可以在here找到。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        相关资源
        最近更新 更多