SSHで「lsof」を使用すると、なぜ機能しないのですか? [コピー]

SSHで「lsof」を使用すると、なぜ機能しないのですか? [コピー]

このコマンドラインが機能しないことがわかりました

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

エラーが表示されます

lsof:プロセスIDが指定されていません。

しかし、

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

PIDを正しく提供してください

なぜlsofPIDを見ることができないのですか?

ベストアンサー1

lsofシェル拡張のため、このコマンドは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

これは自分自身を一致として報告するのではなく、親シェルを報告する$()サブシェルを効果的に開始します。pgrepしたがって-n、オプションを使用すると、実際のpidではなく、pgrep独自のpidが提供されます。

おすすめ記事