我发现这个命令行不起作用
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。因此,使用-n
option 不会给你实际的 pid,而是pgrep
它本身的 pid。