4

別のコマンドと組み合わせてリモート ホストで pkill を実行しようとすると、両方のコマンドが成功したにもかかわらず、常に 255 が返されます。

  1. ssh <remoteHost> 'pkill -f xyz' # returns 0 (rightly so when xyz is a process)
    
  2. ssh <remoteHost> 'source /etc/profile' # returns 0 (rightly so)
    

しかし、組み合わせコマンドを実行すると:

  1. ssh <remoteHost> 'source /etc/profile; pkill -f xyz' # returns 255 - why?
    

「pkill」を別のコマンドと組み合わせた場合、以下は組み合わせであるにもかかわらずゼロを返すため、何かがあります。

  1. ssh <remoteHost> 'source /etc/profile; ls' # returns 0
    

xyzを強制終了しようとするとき、 は常に実行されていると仮定します。

この動作がわかりません。ケース 3 で 255 を返すのはなぜですか?

4

1 に答える 1

8

pkill -fオプションのドキュメントには次のように記載されています。

-f
通常、パターンはプロセス名に対してのみ照合されます。-f が設定されている場合、完全なコマンド ラインが使用されます。

pkill -f xyzそのため、コマンドラインの任意の場所で「xyz」を使用してプロセスを強制終了します。

を実行するssh <remoteHost> 'source /etc/profile; pkill -f xyz'と、リモート ssh サーバーがこれに相当するものを実行します。

$SHELL -c 'source /etc/profile; pkill -f xyz'

結果のシェル インスタンスは、コマンド ラインに「xyz」を含むプロセスです。私の推測では、それpkillがそれを殺しており、ssh は、次のように、終了コード 255 として、終了したセッションを報告しています。

$ ssh localhost 'kill $$'
$ echo $?
255

を実行しただけでは発生しません。これはssh <remoteHost> 'pkill -f xyz'、bash などの一部のシェルがこの場合に最適化されるためです。サブプロセスとして pkill を実行する代わりに、シェル インスタンスはそれ自体を pkill プロセスに置き換えます。そのため、pkill が実行されるまでに、コマンド ラインに「xyz」を含むシェル プロセスはなくなります。

次のように pkill を実行することで、おそらくこれを回避できます。

ssh <remoteHost> 'source /etc/profile; exec pkill -f xyz'

それが機能しない場合は、パターン自体と一致しないように pkill パターンを指定できます。例えば:

ssh <remoteHost> 'source /etc/profile; exec pkill -f "[x]yz"'

パターン[x]yzはテキスト「xyz」に一致するため、pkill はテキスト「xyz」が表示されるプロセスを強制終了します。ただし、パターン自体は一致しないため、pkill はパターンが出現するプロセスを強制終了しません。

于 2016-11-07T21:45:01.437 に答える