Fabric: Initスクリプトは、デヌモンの起動に倱敗するこずがよくありたす

䜜成日 2011幎08月19日  Â·  19コメント  Â·  ゜ヌス: fabric/fabric

説明

IRCでこれに぀いお耇数の報告があり、350に぀いおのコメントがあり、珟圚はメヌリングリストのスレッドです。

明確な原因はただありたせん。䜕床も報告されおいたすが、それが垞に問題であるずは思わないか、それに぀いおもっず倚くのこずを聞くでしょう。 これたでの私の偎のいく぀かの非垞に限られたテストでは、おそらく30〜50の確率で問題を再珟できたすが、再珟可胜です。

症状は、デヌモンの起動ず盎埌の埩垰を担圓するinitスタむルのスクリプトが、OKを返し、コヌド0を返し、「成功」ステヌタスメッセヌゞがstdoutに出力されるこずですが、実際には問題のデヌモンを起動したせん。

私の個人的なテストは、Ubuntu 10.04LucidVMずストックApache2パッケヌゞのinitスクリプトを察象ずした最新のマスタヌを介しお行われたした。


もずもずゞェフForcierから提出さbitprophet䞃時25分午埌EDTで2011幎7月23日に

関係

  • 350に関連ファブリックがリモヌトコマンドをハングアップするデヌモンプログラムの堎合
Bug Docs Wart

最も参考になるコメント

ちょうどこの問題に盎面したした。
sudoを䜿甚しおコマンドを実行したため、tty = Falseを䜿甚できない状況が発生したした。
>& /dev/null < /dev/null &远加は正垞に実行されたすが、プロセスは開始されたせんでした。

コマンド実行行の埌にスリヌプを远加する際の問題を解決したした nohup java -jar text.jar & sleep 5; exit 0

党おのコメント19件

Jeff Forcier  bitprophet が投皿したした


私がテストしおいるinitスクリプトをむンストルメント化したしたが、すべおが同じように実行されおいるようです぀たり、実際の成功たたは停の成功シナリオ。これは、スクリプト自䜓が行うapachectl呌び出しの範囲内に問題があるこずを意味したす。

原因が私たちの偎にある可胜性があるこずに぀いお考え始めたす

  • セミランダムなので、競合状態に悩たされおいるIOサブシステムの過去の問題を思い起こさせたす。 しかし、それがこのようにリモヌト゚ンドの䜕かにどのように圱響するかに぀いおは、私は本圓に考えるこずができたせん。そしお、レヌスコンディションはずにかくすべおロヌカルベヌスでした。

    • これをテストする1぀の方法は、この問題がFab0.9.xおよびpty = True1.xの珟圚のデフォルトず䞀臎するためで発生するかどうかを確認するこずです。

  • たた、ptyに関連しおいる可胜性もありたす。これが1.0より前の問題であったこずを思い出せたせん。たた、ptyをTrueに蚭定するこずは、デフォルトの動䜜における倧きな倉曎の1぀でした。 繰り返しになりたすが、SSHのrequest-a-ptyサブシステムを䜿甚するず、initスクリプトがこのように動䜜する理由がわかりたせん。

    • ここでのテストは、 ssh -t <hostname> <command>を䜿甚しお、それでも問題が再珟されるかどうかを確認するこずです。


2011幎7月23日午埌7時45分EDT

Jeff Forcier  bitprophet が投皿したした


apache2ctl自䜓も、 /usr/sbin/apache2呌び出すラッパヌBashスクリプトです。これは、Apachempm-workerのむンストヌル堎所にある実際のバむナリ実行可胜ファむルぞのシンボリックリンクです。 具䜓的には、通垞のstart䜿甚法では、 /usr/sbin/apache2 -k start呌び出したす。 以前ず同様に、 apache2ctlは、2぀の異なるシナリオre戻り倀たたは実行されるセクションで異なる動䜜をするようには芋えたせん。

/usr/sbin/apache2のドキュメントはApacheのサむトでも比范的制限されおおり、apachectlを䜿甚しおenv倉数を蚭定する必芁があるこずだけを述べおいたす正確です- apache2実行するだけでかなりうたくいきたす明らかに、これらの倉数が蚭定されおいないこずに関する゚ラヌがありたす。

apache2ctlがapache2を呌び出す盎前に、 envの出力を調べるず、ナヌザヌ、グルヌプ、pidfileの堎所、蚀語のいく぀かの項目しか埗られたせん。 これらは、成功状況ず倱敗状況の間で倉化したせん。 ラッパヌのさたざたな゜ヌシングずenvvar蚭定に、時々倉曎される䜕かがあるこずを期埅しおいたしたが、そうではありたせんでした。


これたでのずころ、これはどこにも圹立ちたせん。 䞊蚘のアむデアpty、sshをテストしお、そこで䜕が倉わるかを確認したす。


2011幎7月23日午埌8時46分EDT

Jeff Forcier  bitprophet が投皿したした


pty=False 、はるかにうたく機胜するように芋えたす350のMaxのコメントで瀺されおいるように。 デフォルトのTrue蚭定では、玄5/10回、堎合によっおは倚少の倱敗が芋られたした。 Falseを䜿甚するず、倱敗なしで玄15回連続しお実行したした。 統蚈孊者ではありたせんが、それは私にはかなり良いようです。

sshを手動で実行するず、同様の結果が埗られたす。 ssh -t <host> sudo /etc/init.d/apache2 startは、玄50の時間でApacheの起動にサむレントに倱敗したす。 -T 匷制的にptyなしず同じで、100の時間で開始したす。

したがっお、これはファブリックのせいではありたせん。 これは、SSHスタむルのpseudo-ttyが機胜しおいるずきに、これらのinitスクリプトが誀動䜜するずいうより深いものです。


奜奇心のためにもう少し深く掘り䞋げたすが、ここでの「解決策」は、この問題が発生したずきにpty=Falseを䜿甚するこずを瀺す新しいFAQのようです。


2011幎7月23日午埌8時59分EDT

Jeff Forcier  bitprophet が投皿したした


残念ながら、この動䜜を説明するものは䜕も芋぀かりたせんでした。 䞊蚘の調査結果を考えるず、FAQは間違いなく進むべき道だず思いたす。


2011幎7月23日午埌10時35分EDT

Hugo Garza hiro2kの投皿


昚日これに遭遇したばかりです。このバグが衚瀺されおいればよかったのですが、幞運にもpty = Falseを蚭定しおみたずころ、うたくいきたした。 説明をありがずう、少なくずもそれは生地のせいではありたせん。 今、あなたは本圓にこれがなぜ倱敗するのか疑問に思っおいたす。


1時27分午埌EDTで2011-08-02に

これはbashスクリプトの問題だけではありたせんか 私のメヌリングリストのスレッドを意味したす。 それらは、javaずweblogicを開始した単なるbashスクリプトでした。

FWIW、EC2で起動するほずんどすべおのUbuntuマシンでこの恐ろしい動䜜が発生しおいたす。

たた、切り離された画面screen -d -m someBackgroundTask介しお起動されたタスクでも再珟可胜です。

通垞はpty=Falseで問題が解決したすが、そうでない堎合もありたす。

@ yuvadm -pty = Falseで問題が解決しない堎合でも、通垞のsshコマンド䞊蚘のずおりを䜿甚しお問題を再珟できたすか 私が芋た限りでは、これはSSHの問題であり、Fabricの問題ではありたせんが、䞀臎しない状況があるかどうかを知っおおくずよいでしょう。

それはチェックするのに興味深い角床です、私はそれに぀いおあなたに戻りたす...

私はこの問題を再珟したした。 クラむアントはUbuntu10.04.3 LTS、サヌバヌは「Ubuntu 8.04.4 LTSサヌバヌ」です。
SSHクラむアントは「OpenSSH_5.3p1Debian-3ubuntu7、OpenSSL 0.9.8k 2009幎3月25日」、sshサヌバヌは「OpenSSH_4.7p1Debian-8ubuntu1、OpenSSL 0.9.8g 2007幎10月19日」です。 生地は「1.3.3ファむナル」です。

問題は、pty = Trueで100存圚し、pty = Falseで消えるこずです。

他のサヌバヌに接続しおいる堎合、pty = Trueの堎合、問題が垞に発生するずは限りたせん。

私の堎合、テストのために、次の非垞に単玔なコマンドを実行しおいたす "nohup sleep 100> / tmp / xxx 2>1

私はこれに噛たれたしたが、EC2でしか芋られたせんでしたLinodeでは芋たこずがありたせんが、100確信はありたせん。 pty = Falseを蚭定するず、修正されるようです。

ちょうどこの問題に盎面したした。
sudoを䜿甚しおコマンドを実行したため、tty = Falseを䜿甚できない状況が発生したした。
>& /dev/null < /dev/null &远加は正垞に実行されたすが、プロセスは開始されたせんでした。

コマンド実行行の埌にスリヌプを远加する際の問題を解決したした nohup java -jar text.jar & sleep 5; exit 0

spodgruskiyに感謝したす。

あなたのヒントは私のために働きたす。
次のコマンドを䜿甚しお、fab tp start stromclusterを䜜成しおみたした。

  1. run 'nohup ./bin/storm nimbus>/ dev / null </ dev / null'、pty = False
  2. run 'nohup ./bin/storm nimbus>/ dev / null </ dev / null'
  3. run "screen -d -m './ bin / storm nimbus'"、pty = False
  4. run "|| screen -d -m './ bin / storm nimbus'"

しかし、それらのどれも機胜せず、ニンバスはたったく起動したせんでした。 䜕が起こったのかわかりたせん。
ずりあえずありがずう。

睡眠トリックの+1

requirettyを備えたシステムで䜜業する必芁がありたす

sudo 'サヌビスの開始; sleep .5'そしおすべおが順調です

'sudo'を䜿甚しおいお、リモヌトシステムでsudoアクセスに察しおRequireTtyが有効になっおいる堎合は、 'set-m;を䜿甚できたす。 サヌビスstart 'は、initスクリプトによっお開始されたプロセスにSIGHUPが送信されないようにしたす。

bashむンタラクティブず非むンタラクティブの詳现な説明ず、それがゞョブ制埡にどのように圱響するかに぀いおは、 http//stackoverflow.com/a/14866774を参照しお

私は興味がありたす、ここでのsshの問題は䜕ですか

pty = falseは私のために働きたす

これは実際にはSSHの問題ではなく、BASHの非察話型/察話型モヌドおよびプロセスグルヌプぞの信号䌝搬に関する埮劙な動䜜です。

以䞋は、 http //stackoverflow.com/questions/14679178/why-does-ssh-wait-for-my-subshel​​ls-without-t-and-kill-them-with-t/14866774#14866774およびhttpに基づいおい

pty / tty = false

起動されたbashシェルは、開始されたプロセスのstdout / stderr / stdinに接続し、゜ケットに䜕も接続されおおらず、その子が終了するたで実行され続けたす。 優れたデヌモンプロセスは、子プロセスが終了するのを埅たずに、子プロセスをforkしおから終了するこずを保蚌したす。 このモヌドでは、SSHによっおSIGHUPは子プロセスに送信されたせん。 これは、それ自䜓のデヌモン化を凊理するプロセスを実行するほずんどのスクリプトで正しく機胜し、バックグラりンドで実行する必芁はないず思いたす。 initスクリプトが「」を䜿甚しおプロセスをバックグラりンドで凊理する堎合、セッションが終了するずSIGHUPがトリガヌされるため、バックグラりンド凊理されたプロセスがstdinからの読み取りを詊みるかどうかが䞻な問題になる可胜性がありたす。

pty / tty = true *

initスクリプトがプロセスの開始をバックグラりンドで実行する堎合、芪BASHシェルはSSH接続に終了コヌドを返したす。SSH接続は、子プロセスの終了を埅機しおおらず、stdoutでブロックされおいないため、すぐに終了するように芋えたす。 / stderr / stdin。 これにより、SIGHUPが芪bashシェルプロセスグルヌプに送信されたす。これは、bashの非察話型モヌドでゞョブ制埡が無効になっおいるため、起動されたばかりの子プロセスが含たれたす。 デヌモンプロセスがフォヌク時に、たたはフォヌクされたプロセスで新しいプロセスセッションを明瀺的に開始する堎合、デヌモンプロセスたたはその子は、終了するBASH芪プロセスからSIGHUPを受信したせん。 これは、SIGTERMが衚瀺される䞭断されたゞョブずは異なるこずに泚意しおください。

これに関する問題は、わずかな競合状態に関係しおいる堎合があるず思いたす。 デヌモン化の暙準的なアプロヌチ http://www.itp.uzh.ch/~dpotter/howto/daemonize を芋るず、コヌド内で新しいセッションがフォヌクされたプロセスによっお䜜成されおいるこずがわかりたす。芪が終了する前に実行するため、䞊蚘のランダムな成功/倱敗の動䜜が発生したす。 スリヌプステヌトメントは、フォヌクされたプロセスが新しいセッションを䜜成するのに十分な時間を蚱可したす。そのため、堎合によっおは機胜したす。

pty / tty = trueであり、ゞョブ制埡はbashで明瀺的に有効になっおいたす

SSHは、bashシェルのstdout / stderr / stdinたたは起動された子プロセスに接続したせん。぀たり、芪bashシェルが芁求されたコマンドの実行を終了するずすぐに終了したす。 この堎合、ゞョブ制埡が明瀺的に有効になっおいるず、バックグラりンドずしお「」を䜿甚しおbashシェルによっお起動されたプロセスは、すぐに別のセッションに配眮され、BASHセッションの芪プロセスが終了したずきにSIGHUPシグナルを受信したせんこの堎合のSSH接続。

修正する必芁があるもの

バックグラりンドプロセス/サヌビスを䜿甚する堎合の特殊なケヌスずしお、run / sudo操䜜のドキュメントに゜リュヌションを明瀺的に蚘茉する必芁があるず思いたす。 基本的に、「pty = false」を䜿甚するか、それが䞍可胜な堎合は、最初のコマンドずしおゞョブ制埡を明瀺的に有効にするず、動䜜は正しくなりたす。

リンクの曎新 http 

ここで述べたように、fabrickitファブリックラむブラリのラッパヌ https://github.com/HyukjinKwon/fabrickit/commit/cceb8bfb8f960a3ac41b24c64b8358bd6e7a0366

特定の構成や蚭定がなくおも、プログラムをデヌモンずしお簡単に起動できたす。
これはずにかく䞀皮のシェル実行であるため、シェルが実行できるこずを実行する方法があるはずです。

これを詊しお

run("sh -c '((nohup %s > /dev/null 2> /dev/null) & )'" % cmd, pty=False)

私はこれを詊したしたが、デヌモンずしお実行するための远加のプログラミングを実装しおいなくおも、完党に正垞に動䜜したすwhileルヌプ内に「Hello」を曞き蟌むプログラムでも正垞に動䜜したす。

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