ssh
255の終了ステータスを返すのはそれ自体であるという仮定は正しいです。ssh
manページには、と述べています:
sshは、リモートコマンドの終了ステータス、またはエラーが発生した場合は255で終了します。
単に実行する場合、「プロセスが一致していません」のステータスに対応するssh pi@10.20.0.10 "pkill -f asdf"
終了ステータスを取得する可能性が高くなります。1
pkill
難しい部分は、実行時にSSHでエラーが発生する理由を理解することです
ssh pi@10.20.0.10 "pkill -f asdf || true"
SSHリモートコマンド
SSHサーバーはシェルを起動して、リモートコマンドを実行します。これが実際の動作の例です:
$ ssh server "ps -elf | tail -5"
4 S root 35323 1024 12 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony [priv]
5 S anthony 35329 35323 0 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony@notty
0 S anthony 35330 35329 0 80 0 - 28283 do_wai 12:01 ? 00:00:00 bash -c ps -elf | tail -5
0 R anthony 35341 35330 0 80 0 - 40340 - 12:01 ? 00:00:00 ps -elf
0 S anthony 35342 35330 0 80 0 - 26985 pipe_w 12:01 ? 00:00:00 tail -5
デフォルトのシェルはでbash
あり、リモートコマンドは単純なコマンドではなく、パイプライン、「制御演算子で区切られた1つ以上のコマンドのシーケンス」であることに注意してください|
。
バッシュシェルはによってそれに渡されるコマンドならばということを理解する賢い十分である-c
オプションがあり、単純なコマンド、それが実際に新しいプロセスをforkしないことによって最適化することができ、すなわち、それが直接exec
、単純なコマンドの代わりに、余分な工程を経ねfork
それexec
の前にing の。リモートの単純なコマンド(ps -elf
この場合)を実行すると何が起こるかの例を次に示します。
$ ssh server "ps -elf" | tail -5
1 S root 34740 2 0 80 0 - 0 worker 11:49 ? 00:00:00 [kworker/0:1]
1 S root 34762 2 0 80 0 - 0 worker 11:50 ? 00:00:00 [kworker/0:3]
4 S root 34824 1024 31 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony [priv]
5 S anthony 34829 34824 0 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony@notty
0 R anthony 34830 34829 0 80 0 - 40340 - 11:51 ? 00:00:00 ps -elf
私は以前にこの振る舞いに出くわしましたが、このAskUbuntuの答え以外のより良い参照を見つけることができませんでした。
スキル行動
以来pkill -f asdf || true
、単純なコマンド(それはだではないコマンドリスト)あなたが実行したときに、上記の最適化はそれほど発生しないことができssh pi@10.20.0.10 "pkill -f asdf || true"
、sshd
プロセスのフォークと幹部をbash -c "pkill -f asdf || true"
。
ctxの回答が指摘しているpkill
ように、独自のプロセスを強制終了することはありません。しかし、それはなりますそのコマンドラインと一致する他のプロセスを殺す-f
のパターンを。bash -c
独自の親(それが起こるように) -それは、このプロセスを殺すよう命令は、このパターンにマッチします。
SSHサーバーは、リモートコマンドを実行するために開始したシェルプロセスが予期せず終了したことを確認し、エラーをSSHクライアントに報告します。
pkill
、親シェルプロセスを殺すその引数リストは、正規表現にマッチするので、私は専門用語の異議を上げるでしょう:x || y
あるない化合物のコマンド、それはだコマンドリスト。