为什么“lsof”在 ssh 中使用时不起作用?

为什么“lsof”在 ssh 中使用时不起作用?

我发现这个命令行不起作用

ssh i01n10 "/usr/sbin/lsof -p $(pgrep -nf a.out)"

它显示错误

lsof:未指定进程 ID

然而

ssh i01n10 "$(pgrep -nf a.out)"

正确给出PID

为什么lsof看不到PID?

答案1

lsof由于 shell 扩展,该命令看不到您的 PID。这意味着$(pgrep -nf a.out)将在本地服务器上执行,而不是远程服务器上。

为了避免这种扩展,请使用单引号而不是双引号。

简单的例子:

$ foo=local
$ ssh debian8 "foo=remote; echo $foo"
local
$ ssh debian8 'foo=remote; echo $foo'
remote

您的pgrep命令可能有问题。这是我使用-of而不是标志的简单测试-nf(使用-af标志查看完整命令):

// on remote server
# sleep 200 &
[1] 27228
# exit
// on local host 
$ ssh debian8 'echo $(pgrep -nf sleep)'
27244 <-- not expected pid
$ ssh debian8 'echo $(pgrep -of sleep)'
27228 <-- this one

$()实际上启动了一个子 shell,pgrep不会将自身报告为匹配项,但会报告其父 shell。因此,使用-noption 不会给你实际的 pid,而是pgrep它本身的 pid。

相关内容