无法在 Debian 上使用 -x 选项 pgrep tmux 的 pid(bullseye)

无法在 Debian 上使用 -x 选项 pgrep tmux 的 pid(bullseye)

我正在编写一个脚本,其中一个函数需要检索 tmux 服务器的 pid。

tmux_pid=$(pgrep tmux)

但是脚本名称包含 tmux,例如 tmux-launcher,运行它时,pgrep 返回两个 pid,一个用于 tmux,另一个用于正在运行的脚本本身。我尝试使用它来pgrep -x tmux匹配确切的服务器进程,但没有返回任何 pid。

以下是htoptmux 服务器的输出

PID  USER      PRI  NI  VIRT   RES   SHR S CPU%▽MEM%   TIME+  Command
2991 xxxxx      20   0 15336  3800  2924 S  0.0  0.0  0:00.03 tmux new -d -s se..

为了验证-x选项,我还用两个脚本和pgrep进行了测试,结果显示效果良好。yyyyyy-abc-x

年:

#!/bin/sh  
sleep 60

yyy-abc:

#!/bin/sh
pid=$(pgrep -x yyy)
echo $pid
sleep 30

测试:

➜  ~ ./yyy &
[2] 9219
➜  ~ ./yyy-abc
9219

那么为什么pgrep -x tmux什么都没有显示?是 tmux 的问题还是 pgrep 的问题?

顺便说一句,在 macOS 上,这显示了精确的 tmux 的 pid。

答案1

我刚刚在 WSL 下的 Ubuntu 上也遇到了这个问题。

这个Unix和Linux答案帮助我指明正确的方向。 -x匹配流程姓名来自。这与你在(例如)/etc/<PID>/status中看到的内容相同。htoptmux: server

-xf另一方面,与“完整命令行”(/proc/PID/cmdline)完全匹配。

奇怪的是,使用 tmux 时,“完整命令行”是进程名称的截断形式,而不是相反。

因此,我们有几个选项可以使用 来查找 tmux PID pgrep。请注意,对于 macOS 用户(根据下面 @gpanda 的评论),这些选项不太可能在那里起作用 - 请查看下面的“替代方案”:

命令 结果
pgrep -xo "tmux: server" 返回 tmux 服务器的 PID
pgrep -xo "tmux: client" 返回 tmux 客户端的 PID
pgrep -xof tmux 返回创建的最早的 tmux 实例。
在我的系统上,这是客户端,但这
可能与时间有关。
pgrep -xnf tmux 返回最新创建的 tmux 实例。
在我的系统上,这是服务器,但是...同上。

选择

此外,为了从评论中重述解决方案,作为答案的一部分,以便读者不必在评论中寻找它,@KamilMaciorowski 提供的一个(显然是很好的跨平台)替代方案是让 tmux 通过以下方式报告其自己的 PID:

tmux display-message -p '#{pid}'

相关内容