我正在编写一个脚本,其中一个函数需要检索 tmux 服务器的 pid。
tmux_pid=$(pgrep tmux)
但是脚本名称包含 tmux,例如 tmux-launcher,运行它时,pgrep 返回两个 pid,一个用于 tmux,另一个用于正在运行的脚本本身。我尝试使用它来pgrep -x tmux
匹配确切的服务器进程,但没有返回任何 pid。
以下是htop
tmux 服务器的输出
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
进行了测试,结果显示效果良好。yyy
yyy-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
中看到的内容相同。htop
tmux: 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}'