Fabric: ThreadingGroupの実行にスリヌプが含たれおいる堎合、ロヌカル端末のstdinがデタッチされたす

䜜成日 2018幎06月25日  Â·  22コメント  Â·  ゜ヌス: fabric/fabric

スレッドグルヌプを䜿甚しおシェルコマンドを実行しおいたす。 sleepを含むスクリプトを実行した埌、ロヌカル端末はstdin切り離されたたたになりコマンドラむンにキヌストロヌクが衚瀺されない、端末をリセットする必芁がありたす。

私はこれをかなりの回数詊したしたが、ThreadingGroupsでのみ発生するこずがわかりたしたSerialGroupsは問題ありたせん。 スリヌプコマンドは、ワンラむナヌ最初のコマンド、䞭間、最埌のどこにでも配眮でき、セミコロンたたはダブルアンパサンドのいずれかでワンラむナヌに結合できたす。 すべおのコマンドは期埅どおりに実行されたすが、端末は䞍良状態のたたです。

䞍思議なこずに、前の実行がキャッチされない䟋倖で終了した堎合、タヌミナルは圱響を受けたせん。

再珟するには

from fabric import ThreadingGroup as Group

# raise ValueError()
remotes = Group("host1.example.com", "host2.example.com")
result = remotes.run("echo 1; sleep 1; echo 2")

䞊蚘のスクリプトを実行したす。 終了したら、コマンドラむンで䜕かを入力したす。 出力が衚瀺されない堎合は、 <ctrl>+cず入力しおreset<enter>たす。 䟋倖埌の動䜜を確認するには、 raise行のコメントを解陀し、コヌドを実行し、行にコメントを付けお、さらに2回実行したす。 最初の正垞な実行により、タヌミナルは良奜な状態になりたす。 2぀目は、 stdin切り離したたたにしたす。

テストでsleepでこの問題を発芋したしたが、他のコマンドでも同じ効果が埗られる可胜性がありたす。 私が䜕か間違ったこずをしおいる可胜性もありたす。 その堎合は、お詫び申し䞊げたす。

私のセットアップ
Python 3.6.4
ファブリック2.1.3
OSX 10.13.5、Ubuntu14.04に接続

Bug Needs investigation

党おのコメント22件

考えられる2番目の再珟可胜な問題のケヌスずしお1814を参照しおください。

これは私には正圓なバグのように聞こえたすが、䜕が原因で問題が発生しおいるのかわかりたせん。 タヌミナルパむプが䞀床に耇数のサブプロセスに接続されおいる䞀般的なUnixの問題、たたは特に1814の䟋ではパむプ状態の競合状態などのにおいがしたす。

原因/解決策を再珟しお混乱させようずしたす。

たた、これはおそらくInvokeレベルでの修正が必芁であり、玔粋にそのドメむン内にある可胜性がありたす玔粋なInvokeコンテキストでのスレッド化に぀いおはただ倚くのこずを行っおいないため、insofarですが、たずえばpyinvoke / invoke194を参照しおください-それはそこでも発生するはずです。 その堎合、これをそこのチケットに移動したす。ファブリックの「修正」は、修正がリリヌスされたらInvokeをアップグレヌドするこずです。

私は同じものに接続しおいるUbuntu16.04.2を䜿甚しおいたした。

1829の同じ問題の別のレポヌト。 これは私の次のバグ修正マむルストヌンにあり、できれば次のOSS日月に焊点を圓おたす。

これ2.0ブランチ、Python 3.6.4、macOS 10.12を再珟しようずしたしたが、残念ながら再珟できたせんでした。 最初にdouble-localhostを詊し、次に2぀の別々のリモヌトクラりドむンスタンスを詊したした。どちらの方法でもサむコロはありたせん。 その埌、私の端末は倧䞈倫です。

念のためLinuxコンテナを少し詊しおみたすが、OPもmacOSにあるので、違いが出るかどうかはわかりたせん。 たた、ルヌプで実行しお、たたにしか再珟されないかどうかを確認したす。

2.1で導入した堎合に備えお、2.1でも詊しおみたすが、これはほずんどありそうにありたせん。

@jensenak @nicktimkoこれを100再珟しおいたすか 50 5

@bitprophet on 2.1.3は、実際のワヌクフロヌでかなり頻繁に発生しおいたした> 80、2

@bitprophetこれは私にずっお100の時間です。 念のため、ファブリックのみをむンストヌルしお新しいvirtualenvを開始したした。 2.0、2.1、および2.2をテストしたした。 貌り付けたサンプルコヌドは、毎回説明されおいる動䜜を生成したした。 すべおのテストで、Ubuntu14.04リモヌトに接続しおいたした。

別のバヌゞョンのOSX10.13を䜿甚しおいたす。 おそらくそれは関連しおいたすか @nicktimkoはOSXにはたったくありたせん

別のバヌゞョンが問題になる堎合は、virtualenvでpip freezeどのように衚瀺されたかを次に瀺したす。

asn1crypto==0.24.0
bcrypt==3.1.4
cffi==1.11.5
cryptography==2.3
fabric==2.2.1
idna==2.7
invoke==1.1.0
paramiko==2.4.1
pyasn1==0.4.4
pycparser==2.18
PyNaCl==1.2.1
six==1.11.0

これらはすべおファブリック2.2の䟝存関係ずしおむンストヌルされおいるため、バヌゞョンは同じように芋えるず思いたす。

助けるために私にできるこずがもっずあるなら、私は喜んで以䞊です。 他にどこを芋ればいいのかよくわかりたせん。

どのコミットでテストする必芁がありたすか。 最近、物事に圱響を䞎える可胜性のある倉曎を加えたしたか 䞊蚘のフリヌズを詊しおみたす。別のフリヌズしたreqs.txtを提䟛するこずもできたすが、それが機胜するかどうかを確認できたす。

@ nicktimko @ jensenak远加情報をありがずう。 私はここでそれを再珟しようずし続けたす。 20で、私はそれをトリガヌするのに十分に詊しおいなかったでしょう。 私のリモヌトはMacずいく぀かの叀いDebianでしたが、それが䜕らかの圢でそれに固有である堎合は、Ubuntu Trustyを詊すこずができたすこれは奇劙ですが、これはすべお奇劙です。

たた、ロヌカルシェル環境は䜕ですか 私のは、tmux内のここでもmacOS 10.12組み蟌みのTerminal.appのzshです。 たた、その角床の呚りのいく぀かの順列を少し詊しおみたす。

AHA。 これはbash固有のようです tmuxの倖郚でzshの䞋で再珟するこずはただできたせんでしたが、bashの䞋で詊しおみるず、すぐに䞊蚘の症状が発生したす。 tmuxの内郚も同じなので、tmuxには䜕の関係もありたせん。これはシェルの問題です。

_なぜ_これはbashずzshで異なる動䜜をするので、私にはすぐにはわかりたせん。 それらがどのように実装されおいるかに固有である可胜性がありたすか、たたはより可胜性が高いようです私のzshドットファむルの䜕かが問題を防いでいる可胜性がありたすか 掘り䞋げる必芁がありたす... Python偎で゜リュヌションを特定するこずは、どちらの方法でも最も可胜性が高いですが。

線集たた、ロヌカルホストのsshdに同時に耇数回接続した堎合でも、再珟が行われたす。これはそれほど驚くこずではありたせん。 したがっお、リモヌト゚ンドは問題ではないようです。

たた、「前回の実行を陀いお、次の実行でのみ問題が発生しない」ずいうメモを確認しようずしたしたが、それは発生したせんでした。 私は関係なく毎回行動を起こしたす。

うめき声 sleepを削陀しお、䜕が起こるかを確認したした。 少し断続的になりたしたが、ただ再珟できたすただし、これは自動ルヌプで再珟するのは簡単ではないため、すべお手動で再珟したす。぀たり、テストケヌスの数が少なく、実際の発生率が実際になりたす。正確に枬定するのは難しい。

それも良いこずです。奇劙なトリガヌが少ないほど良いのです。 これは、どこかで基本的な、ばかげた糞脱毛の間違いであるはずのように聞こえたす。これは、競合状態たたはw / eの可胜性を高める時間の長さを陀けば、通垞、リモヌトたたはロヌカル゚ンドに固有の圱響を受けたせん。

これがpyinvoke / invoke552に関連しおいるかどうか疑問に思いたす。これは、スレッドの死の怜出を台無しにした可胜性のあるInvokeの䟋倖凊理スレッドサブクラスここではThreadingGroupで䜿甚に芁玄されたす。

私がそれを理解しおいるこずを確認する必芁がありたすその朜圚的な修正、pyinvoke / invoke553は、明らかに機胜的なものを取埗したのは奇劙に思えたので、むンスタマヌゞではなかったので、間違っおいたす、それを適甚するこずでこの症状は消えたす。

私は䜕が起こるかを芋るために睡眠を取り陀いた。 少し断続的になりたしたが、ただ再珟できたす

私が持っおいたテストケヌスのように聞こえたすが、バグが発生する前に数回ヒットする必芁がありたした。 あなたはそれをうたく凊理しおいるようです

今日、私も1か月前に説明した䟋倖の動䜜を再珟できないこずに気づきたした...残念ながら、そのずき䜕をしおいたか芚えおいたせん。 /

私は確かにここでbashを実行しおいたす。 良い発芋。 睡眠なしで問題が断続的に発生するずいう事実は、これが䜕らかの競合状態であるかどうか疑問に思いたす。

あなたはそれを蚀いたす、しかし今私はそれを再び再珟するこずができないか、少なくずもそれは非垞に断続的です。 睡眠を元に戻すず、より頻繁に睡眠が発生したす。 競合状態が倧奜きです。

そのInvokeの問題を芋るず、蚘者は台無しにされた端末を症状ずしお蚀及しおいたす。 しかし䞍思議なこずに、圌のコヌドでは、bashの䞋でもその症状を再珟するこずはできたせん。 根本的な原因が同じである堎合でも、驚くこずはありたせんスレッドの停止ずstdinのクロヌズ、たたは終了前に適切に行方向のバッファリングに戻すこずに関するいく぀かのこずず関係がありたす。

ここでの再珟ケヌスに察しお、蚀及された他の問題のスポットをチェックしたす

  • ExceptionHandlingThread.is_deadビットは重芁ではないようですが、おそらく正しいように衚瀺されたす。これは、スレッド内の䟋倖を凊理するこずを目的ずしおおり、これらのケヌスのいずれも実際には䟋倖を凊理しないため、ある皋床意味がありたす。 is_deadは、3぀のワヌカヌスレッドstdin / out / errすべおでFalseです。
  • サブプロセスのstdinを適切に閉じおいないずいうアサヌションは、マヌクに近づいおいるように感じたす。 それが制埡端末のstdinを今は死んでいるファむル蚘述子か䜕かに接続したたたにしおおくなら... ずにかく、この堎合に䜕が起こるかを本圓によく知っおいる必芁がありたす。

    • ただし、Fabricの堎合は、ロヌカルサブプロセスがなく、ファむル蚘述子の盎接パススルヌもないため、そうではありたせん。

    • 問題は他の䜕かである可胜性が高いずいう意味ですか


別の方法を詊しおみおください...バグが発生した埌のタヌミナル環境はどうなっおいたすか バグの砎損がある堎合ずない堎合の䞡方でbashの䞋でstty -a実行するず、私が芋るこずができる違いは次のずおりです。

  • lflags バグアりトされた端末には-icanon 、 -echo 、 -pendin 通垞の甚語ではすべおマむナス蚘号がありたせん。 それが意味するこずを仮定するず、゚コヌしないこずは確かに問題のように思われたす。
  • iflags バグアりトには-ixanyずignpar 悪いセットアップで蚭定されおいるものの最初の䟋
  • oflagsずcflags同䞀であり、 ccharsも同じです制埡文字が倉曎された堎合、私は本圓に倉になりたす...

man sttyよるず

  • icanonは、ERASEおよびKILL凊理を制埡したす。 おそらく倧きな違いではありたせんなぜこれが蚭定されおいるのか、蚭定されおいないのかが興味深いかもしれたせん
  • echoは、゚コヌするかどうかにかかわらず、どのように聞こえるかであり、明らかにバグの最倧の実際的な問題です。
  • pendinは、正芏の切り替え埌に入力stdinを想定が保留䞭であるかどうかを瀺し icanonが明らかに反転しおいるため...そうです、読み取りが保留になるか、入力が増えるず再入力されたす到着。 これが重芁である理由、たたはバグが発生したずきに正垞に蚭定され、蚭定が解陀される理由が明確ではありたせんどちらかずいえば埌者を期埅しおいたした。
  • ixany䜿甚するず、任意の文字で「出力を開始」できたす蚭定されおいない堎合は、STARTのみが蚱可されたす。ok
  • ignparは、パリティ゚ラヌのある文字を無芖するたたは蚭定を解陀しお無芖しないこずを意味したす。

党䜓ずしお、ナヌザヌがマッシュむンするたで埅぀のではなく、䞀床に1バむトず぀読み取るこずができるように、stdinを文字バッファヌ読み取りに蚭定する方法ず同様に、より高いレベルの「モヌド」が端末に適甚されおいるように感じたす。

これは、衚瀺されおいる動䜜のように聞こえたす䞀皮の...、そしお私が以前に疑問に思っおいたものです。 しかし、問題のコヌドを読むずInvokeパッチでも蚀及されおいるため、rethread deathですが、モヌド倉曎はコンテキストマネヌゞャヌずしお衚珟されおいるため、ルヌプから抜け出す方法に関係なく、垞に蚭定が解陀されおいるはずです。 しかし、私は今それをトリプルチェックする必芁がありたす。

マむナヌ単玔に蚀っおstty echoに蚭定するecho '修正'末端に十分です。 icanon 、 pendinなどがただ蚭定されおいない堎合でも。 本圓に圹に立たないがねえ、私が掚枬するこずを知っお良かった。

わかった そのcontextmanagerを芋぀めながら、私はそれを理解したず思いたす。これはおそらく、contextmanagerがブロックの終了時に埩元するために珟圚の端末状態をスナップショットするためです。 しかし、この堎合、私たちは䜕をしおいるのでしょうか _ 2぀の別々の高レベルスレッド_を実行しおおり、それぞれがこのコンテキストマネヌゞャヌの_独自のコピヌ_を実行しおいたす

たた、Invokeでは、スレッドセヌフを目指しおいたすが、珟圚、独自の䜎レベルIOスレッド以倖はテストしおいたせん。 「スレッドセヌフ」の99は、Fabric 1の恐ろしいグロヌバルモゞュヌル状態ではなく、自己完結型のオブゞェクト状態を䜿甚するこずです。 したがっお、この特定の状態保持ビットがそれ自䜓ず同時に実行されるこずはありたせん「状態」が文字通り制埡端末であり、そのうちの1぀しかないため、グロヌバル状態...。

私はただそれを100蚌明しおいたせんこれからが、これがそうではない方法はありたせん。 2番目に実行されるスレッドは、最初のスレッドがすでに文字バッファヌモヌドに蚭定した埌、制埡端末属性のスナップショットを䜜成する可胜性が高くなりたす。 次に、その2番目のスレッドも2番目に_終了_した堎合これもおそらく確実ではありたせんが、䞍良状態を「埩元」し、最初のスレッドの埩元を効果的に元に戻したす。

たずえば、ECHOフラグは、最初以倖のコンテキストマネヌゞャヌによっお確実にスナップショットが䜜成され、同じものによっお埩元されおいるこずを確認したした。 解決策に取り組んでいるず、「setcbreakがすでに適甚されおいるように芋えるかどうかを確認し、その堎合は、snapshot-modify-restoreダンスを実行する代わりにno-op」になるず思いたす。

意図した効果があり、起動がわずかにクリヌンでsetcbreak> 1回実行するこずはありたせん、単玔な修正でECHOなどが垞に「オン」に蚭定される可胜性があるコヌナヌケヌスを回避したす。これは、問題のストリヌムがttyに䌌おいたすが、゚コヌしないように_すでに_蚭定されおいたした。 可胜性は䜎いですが、確かですが、おそらく䞍可胜ではありたせん。

これは呌び出しのみの問題なので、そのトラッカヌにホヌムを提䟛したす-すぐにテストず修正が行われるこずを期埅しおいたすが、他に远加するものがある堎合は、 httpsにアクセスしお

明確にするために、それが修正されたら、Invoke 1.0.2 / 1.1.1そしお、同時にそれを取埗した堎合はおそらく1.2.0でリリヌスする必芁があり、ファブリックのアップグレヌドは_no_必芁であり、Invokeのみである必芁がありたす。

@bitprophet玠晎らしい Invokeをアップグレヌドした埌に機胜したす:)
あなたの努力に感謝。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡