Process

在 tmux 窗格中向程序發送信號

  • January 16, 2022

假設應用程序 X 正在 tmux 窗格的前台執行。我想向應用 X 發送一個給定的信號,例如 SIGUSR1。我可以配置一個 tmux 鍵綁定來向目前選擇的窗格的前台程序(或程序組)發送信號嗎?

在我的 Kubuntups中,可以給我程序連接到的終端上的前台程序組的 ID。關鍵字是tpgid。如果我告訴ps查詢由tmuxas標識的程序,#{pane_pid}那麼我將在此窗格中獲得前台程序組 ID。

以下綁定(in ~/.tmux.conf)將使prefix``kSIGUSR1 發送到前台程序組(預設prefixCtrl+ b):

bind-key k run-shell 'kill -s USR1 -- "-$(ps -o tpgid:1= -p #{pane_pid})"'

筆記:

  • 前面的破折號( -)$(…)負責定位前台程序。您可以嘗試不使用破折號僅針對一個程序;它將是前台程序組“領導者”。但不能保證“領導者”(仍然)存在。以群組為目標是一種理智的方法,它類似於Ctrl+c向群組發送 SIGINT,儘管機制不同。

  • :1取自這個答案:Format pscommand output without whitespace。當我們添加破折號時,去掉前導空格是至關重要的。

  • 有一個競爭條件:kill在之後行動ps並且不能保證程序組仍然在前台(或根本存在)。

  • 您可能會很不幸,並且prefix``k在您想要定位的程序退出的時候遇到了問題。這樣您可能會無意中將 SIGUSR1 發送到另一個程序。它可能是外殼。接著…

  • SIGUSR1 的預設操作是終止。特別是您的互動式 shell 在前台(即等待命令)可能會在prefix``k. 巴什會。您可以通過預先設置陷阱來防止這種情況:

    • trap '' USR1將使外殼忽略信號。在這種情況下,子程序也將忽略該信號,除非它們明確選擇處理它(例如dd這樣做)。
    • trap : USR1將使外殼“忽略”信號(無所作為做出反應),但這不會影響子程序的行為。

引用自:https://unix.stackexchange.com/questions/686467