Process
在 tmux 窗格中向程序發送信號
假設應用程序 X 正在 tmux 窗格的前台執行。我想向應用 X 發送一個給定的信號,例如 SIGUSR1。我可以配置一個 tmux 鍵綁定來向目前選擇的窗格的前台程序(或程序組)發送信號嗎?
在我的 Kubuntu
ps
中,可以給我程序連接到的終端上的前台程序組的 ID。關鍵字是tpgid
。如果我告訴ps
查詢由tmux
as標識的程序,#{pane_pid}
那麼我將在此窗格中獲得前台程序組 ID。以下綁定(in
~/.tmux.conf
)將使prefix``k
SIGUSR1 發送到前台程序組(預設prefix
為Ctrl
+b
):bind-key k run-shell 'kill -s USR1 -- "-$(ps -o tpgid:1= -p #{pane_pid})"'
筆記:
前面的破折號(
-
)$(…)
負責定位前台程序組。您可以嘗試不使用破折號僅針對一個程序;它將是前台程序組“領導者”。但不能保證“領導者”(仍然)存在。以群組為目標是一種理智的方法,它類似於Ctrl
+c
向群組發送 SIGINT,儘管機制不同。
:1
取自這個答案:Formatps
command output without whitespace。當我們添加破折號時,去掉前導空格是至關重要的。有一個競爭條件:
kill
在之後行動ps
並且不能保證程序組仍然在前台(或根本存在)。您可能會很不幸,並且
prefix``k
在您想要定位的程序退出的時候遇到了問題。這樣您可能會無意中將 SIGUSR1 發送到另一個程序。它可能是外殼。接著…SIGUSR1 的預設操作是終止。特別是您的互動式 shell 在前台(即等待命令)可能會在
prefix``k
. 巴什會。您可以通過預先設置陷阱來防止這種情況:
trap '' USR1
將使外殼忽略信號。在這種情況下,子程序也將忽略該信號,除非它們明確選擇處理它(例如dd
這樣做)。trap : USR1
將使外殼“忽略”信號(無所作為做出反應),但這不會影響子程序的行為。