リモートサーバーからPMD(Poll Mode Driver)のCPUデータを抽出しようとしています。次のようにする必要があります。
pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU
01:48:19 PM UID TGID TID %usr %system %guest %CPU CPU Command
01:48:20 PM 997 - 28553 0.00 0.00 0.00 0.00 14 |__pmd8
01:48:20 PM 997 - 28555 100.00 0.00 0.00 100.00 27 |__pmd9
01:48:20 PM 997 - 28556 100.00 1.00 0.00 100.00 38 |__pmd10
01:48:20 PM 997 - 28557 0.00 0.00 0.00 0.00 39 |__pmd12
01:48:20 PM 997 - 28558 100.00 0.00 0.00 100.00 2 |__pmd11
01:48:20 PM 997 - 28559 100.00 0.00 0.00 100.00 15 |__pmd14
01:48:20 PM 997 - 28560 100.00 1.00 0.00 100.00 3 |__pmd13
01:48:20 PM 997 - 28561 100.00 0.00 0.00 100.00 26 |__pmd15
Average: UID TGID TID %usr %system %guest %CPU CPU Command
Average: 997 - 28553 0.00 0.00 0.00 0.00 - |__pmd8
Average: 997 - 28555 100.00 0.00 0.00 100.00 - |__pmd9
Average: 997 - 28556 100.00 1.00 0.00 100.00 - |__pmd10
Average: 997 - 28557 0.00 0.00 0.00 0.00 - |__pmd12
Average: 997 - 28558 100.00 0.00 0.00 100.00 - |__pmd11
Average: 997 - 28559 100.00 0.00 0.00 100.00 - |__pmd14
Average: 997 - 28560 100.00 1.00 0.00 100.00 - |__pmd13
Average: 997 - 28561 100.00 0.00 0.00 100.00 - |__pmd15
これはリモートサーバーに送信するコマンド文字列です。
ssh -vvvv [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'
私が見た内容は次のとおりです。
pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\\|%CPU
単一のスラッシュでなければならない二重バックスラッシュを除いて、すべてが正しいです。
ベストアンサー1
SSHは実際にサーバーに送信するバックスラッシュの数に依存しているようです。いくつかの簡単な例を見てみましょう。
ssh -v juha@goliath 'echo h\ello'
...
debug1: Sending command: echo h\\ello
hello
...
ssh -v juha@goliath 'echo h\\ello'
...
debug1: Sending command: echo h\\\\ello
h\ello
...
ssh -v juha@goliath 'echo h\\\ello'
...
debug1: Sending command: echo h\\\\\\ello
h\ello
...
ssh -v juha@goliath 'echo h\\\\ello'
...
debug1: Sending command: echo h\\\\\\\\ello
h\\ello
...
SSHは、引用されたコマンドをリモートシェルに正しく渡すようです。後者の出力は、ローカルでコマンドを実行したときに得られるものとまったく同じです。
一方、SSHはデバッグメッセージのバックスラッシュ数を盲目的に倍増するようです。追加の参照レベルが導入された場合(例:
ssh -v juha@goliath "echo 'h"'\\'"ello'"
...
debug1: Sending command: echo 'h\\\\ello'
h\\ello
...
最後の例の引用方式をより明確にするには、SSHコマンドの最後のパラメータは、および"echo 'h"
3'\\'
つの文字列を連結することです"ello'"
。ローカルシェルはそれを変換してecho 'h\\ello'
最初にSSHに渡します。
それでは、次のコマンドを実行してみてください。
ssh -vvvv [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'
2つの一重引用符の前にpidstat
。これはpidstat -t -p
参照されませんが、これは害を与えません。したがって、上から見ると、リモートシェルは最後の引数を正しく受け取り、grep
必要に応じて渡された拡張pmd\|%CPU
正規表現に変換するようです。pmd|%CPU
grep
したがって、これが期待どおりに機能しない場合は、バックスラッシュ以外の理由がある可能性があります。
次のようにバックスラッシュを完全に避けることでこれを確認できます。
ssh -v [email protected] 'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '"'pmd|%CPU'"
'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '
ここで最後のパラメータは、"'pmd|%CPU'"
2つの文字列を連結したものです。ローカルシェルはそれを変換しpidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E 'pmd|%CPU'
てSSHに渡します。