![SSHで「lsof」を使用すると、なぜ機能しないのですか? [コピー]](https://linux33.com/image/6427/SSH%E3%81%A7%E3%80%8Clsof%E3%80%8D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E3%81%AA%E3%81%9C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
このコマンドラインが機能しないことがわかりました
ssh i01n10 "/usr/sbin/lsof -p $(pgrep -nf a.out)"
エラーが表示されます
lsof:プロセスIDが指定されていません。
しかし、
ssh i01n10 "$(pgrep -nf a.out)"
PIDを正しく提供してください
なぜlsof
PIDを見ることができないのですか?
答え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が提供されます。