AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1855834
Accepted
Ram Rachum
Ram Rachum
Asked: 2024-09-15 21:42:46 +0800 CST2024-09-15 21:42:46 +0800 CST 2024-09-15 21:42:46 +0800 CST

Byobu:终止当前窗口中的前台进程

  • 772

我使用 Byobu 来运行不同的长时间运行的进程。有时我想停止这些进程。它们并不总是响应Ctrl-C或Ctrl-Z。是否可以制作一个 Byobu 热键,只查找当前活动的 Byobu 窗口中正在运行的前台进程并kill -9执行它?

byobu
  • 3 3 个回答
  • 142 Views

3 个回答

  • Voted
  1. mrd83
    2024-09-18T20:40:33+08:002024-09-18T20:40:33+08:00

    我们将利用bindkey创建快捷方式和内置命令pgrep和pkill。作为附加信息/演示,我将使用ps它的一些选项。

    我们走吧:

    1.ps有一些有趣的参数,我们要重点关注的是T,-C <command name>和-o pid=(是的,之后没有了=!)。

    注意:整个段落旨在展示,以便轻松检查下一个解决方案的正确性。
    • ps T打印当前终端中正在运行的进程。例如,我创建了/bin/phps指向 PhpStorm 的临时符号链接,因此运行phps &会在后台打开所提及的 IDE 实例。在一个终端中运行它后(>/dev/null 2>&1添加后不会打印任何内容,&表示“在后台运行”):

      ps T 演示

      (您可能还注意到当前终端中运行的后台作业数量从绿色变为0了红色!1!)
      现在,它在第二个终端中的样子如下:

      ps T——第二终端

    • 现在我们要尝试ps -C <command name>- 将我的 phps 作为搜索命令:

      ps -C 演示

      在另一个终端我们有:

      pc -C——第二终端

      请注意,第二个终端是pts/0(查看上图),但在这两个终端上我们都收到了pts/1结果(正确!)——因为那是我们运行命令的终端。
      由于这种行为,我开始使用它ps T——所以我们可以捕获当前终端中正在运行的PID进程。

    • 我想要详细说明的最后一个参数是-o pid=。它是一个输出修饰符,它只是使ps打印仅包含 PID,而不包含标题(第一行)。最简单的解释方式始终是视觉方式:

      -o pid=解释

    • 所以 - 这里要做的最后一件事是将以上所有内容结合起来。我们将简单地使用ps -C phps -o pid= 以下结果 ps T:

      命令组合-主终端

      在另一个终端中:

      命令组合-其他终端

      我们可以看到,我们实现了预期的结果 —— 我们可以捕获所选进程的 PID,但前提是它在当前终端中运行。

    2. 我的真正解决方案是基于“pgrep”和“pkill”命令,因为它们更合适,但请注意,使用上述命令ps也可以。

    使用的主要原因pgrep是其内置参数-s 0,记录为“仅匹配列出了进程会话 ID 的进程。会话 ID 0 被转换为 pgrep 或 pkill 自己的会话 ID。”。
    • 然后,让我们看看它的实际效果:

      主终端中的 pgrep

      在第二个终端中:

      另一个终端中的 pgrep

      如图所示 - 我们可以使用 实现我们之前所做的事情ps,但只需一个命令。pkill与 类似pgrep,因此它采用相同的参数。 让我们看看它是如何工作的 -在第二个终端中:

      在其他终端中 pkill

      正如预期的那样 - 它没有终止该进程,因为它不属于当前终端。现在来看看主控制台:

      pkill 的实际行动

      所以 - 我们终于得到了想要的结果。最后一步是将我们的命令绑定到快捷方式。

      为了为 zsh 创建它,我们将使用以下命令:

      bindkey -s '^k' 'pkill <YOUR ACTUAL BINARY> -s 0\n'
      

      (此特定示例将命令绑定到 CTRL+k 组合)

      然后只需将其添加到您的~/.zshrc或/etc/zsh/zshrc(用于全球采购) - 您就完成了。


    额外提示:请注意,默认情况下pkill(并且kill事实上)会发送SIGTERM信号(如果未指定),如果您的进程接受其他信号,您可以轻松利用它,方法是将其用作pkill 的附加参数。这样做的目的是正常--signal <NAME>关闭进程。通常,特定守护进程接受的信号列表列在部分中。示例来自:man <NAME>SIGNALSman stunnel

    SIGNALS
           The following signals can be used to control stunnel in Unix environment:
           SIGHUP
               Force a reload of the configuration file.
               Some global options will not be reloaded:
               ·   chroot
               ·   foreground
               ·   pid
               ·   setgid
               ·   setuid
               The use of the 'setuid' option will also prevent stunnel from binding to privileged (<1024) ports during configuration reloading.
               When the 'chroot' option is used, stunnel will look for all its files (including the configuration file, certificates, the log file and the pid file) within the chroot
               jail.
           SIGUSR1
               Close and reopen the stunnel log file.  This function can be used for log rotation.
           SIGUSR2
               Log the list of active connections.
           SIGTERM, SIGQUIT, SIGINT
               Shut stunnel down.
    

    可以使用命令轻松获取可用信号的列表kill -l。

    因此,如果您想使用相当于kill -9 <PROCESS>(等于kill -SIGKILL <PROCESS>) - 只需在命令中添加--signal SIGKILL(或简单地:) 。-9pkill

    • 1
  2. Best Answer
    Ram Rachum
    2024-09-28T20:03:34+08:002024-09-28T20:03:34+08:00

    ~/bin/_byobu_kill_process.sh:

    #!/bin/bash
    
    window_id=$(tmux display-message -p '#I')
    
    pane_id=$(tmux list-panes -t :$window_id -F '#{pane_active}#D' | grep '^1' | cut -c 2-)
    
    fg_pid=$(tmux display-message -t :$window_id.$pane_id -p '#{pane_pid}' | xargs pgrep -P | xargs ps -o stat,pid= -p | grep '+' | awk '{print $2}')
    
    if [ -z "$fg_pid" ]; then
        echo "No foreground process found in window $window_id"
        exit 1
    fi
    
    get_child_pids() {
        local parent_pid="$1"
        local child_pids=$(pgrep -P "$parent_pid")
        for pid in $child_pids; do
            echo "$pid"
            get_child_pids "$pid"
        done
    }
    
    pids_to_kill=$(echo "$fg_pid"; get_child_pids "$fg_pid")
    
    processes_info=$(ps -o pid=,ppid=,comm= -p $pids_to_kill)
    
    for pid in $pids_to_kill; do
        kill -9 "$pid" 2>/dev/null
    done
    

    ~/.bybou/keybindings.tmux:

    unbind-key k
    bind-key k run '~/bin/_byobu_kill_process.sh'
    
    • 0
  3. Philip Jonsén
    2024-09-21T14:42:54+08:002024-09-21T14:42:54+08:00

    是的,您可以创建自定义 Byobu 热键来终止当前活动的 Byobu 窗口中的前台进程。设置方法如下:

    1. 创建一个脚本来终止前台进程您需要编写一个小脚本来识别活动 Byobu 窗口中的前台进程并向其发送 kill -9 信号。

    2. 在您的主目录(或您喜欢的任何位置)中创建一个名为 kill_foreground_process.sh 的文件:

      #!/bin/bash
      
      # Get the Byobu window number of the currently active window
      window=$(tmux display-message -p '#I')
      
      # Get the process ID (PID) of the foreground process running in the current window
      pid=$(tmux list-panes -F '#{pane_active} #{pane_pid}' | grep '^1 ' | awk '{print $2}')
      
      # If a PID was found, kill the process
      if [ -n "$pid" ]; then
          kill -9 "$pid"
          echo "Killed process with PID $pid"
      else
          echo "No active foreground process found."
      fi
      
    • -2

相关问题

  • Byobu 的状态栏指示器代表什么含义?

  • PuTTY终端输入屏宽自动缩小

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve