pianod
私はArch Linux ARMを使用してRaspberry PiでPandoraクライアント/サーバーを実行しています。pianod
起動時にサービスとして実行するように設定しました。ネットワークスタックの前に起動するのでgetaddrinfo()
失敗します。pianod
60秒ごとにネットワークログインを再試行するように設定できます。
systemd
(余談:始める前にネットワークスタックを待ついくつかの確実な方法を試しましたが、うまくいきませんでしたpianod
。systemd
スリープ状態にする他のトリックはありますか?
pianod
起動時の初期障害後60秒ごとにネットワークを再試行しても、getaddrinfo()
このエラーが発生しますEAI_NONAME
。プロセスを手動で再起動すると、すべてが正常に機能します。
getaddrinfo()
問題は、startへの最初の呼び出しがres_init()
呼び出され、ロードを試みるときのようです/etc/resolv.conf
。 DHCPはまだ正しいDNS情報(?)でファイルを初期化していないため、プロセスの内部に誤ったDNS(localhostだと思います)情報がロードされます。グローバル_res
変数。これによりプロセスが中断されますEAI_NONAME
。
res_init()
呼び出しが失敗した後にDNS情報を再ロードするための手動呼び出しを追加すると、getaddrinfo()
すべてが正しく機能します。つまり、getaddrinfo()
起動後60秒後に最初のログイン再試行が成功しました。
ところで…これが問題だとは驚きですね。デフォルトでは、同じことを行い、マニュアルを必要としない他のサービスがありますres_init()
。他のプロセスははるかに多くのことを行いますが、悪い大きな絵fork()
から外れている部分がどこにあるのかわかりません。_res
全体的に、Linuxにこのような問題があるという事実に驚きました。
だから私が逃したものが何であるか尋ねなければならないと思いました。私の説明は正しいと思いますか?それでは、アップストリームがこれをよりうまく処理できないのはなぜですか?そうでなければ、何を調べるべきですか?この問題を処理するためのより良い標準的な方法はありますか?
更新:要求に応じて現在のサービスユニットの説明は次のとおりです。
私もAfter=network.target
追加しようとしましたRequires
。人々によると、systemd
これはあるリリースから次のリリースに信頼できません。
[Unit]
Description=Pandora Client Daemon
After=syslog.target
[Service]
EnvironmentFile=/etc/pianod.env
ExecStart=/usr/sbin/pianod $INITSCRIPT $USERFILE $PORT $LOGGING -nroot
Restart=on-abort
[Install]
WantedBy=multi-user.target
答え1
Unixインターフェースと内部設計は、ネットワーク構成が非常に静的な時代にさかのぼります。ノートブックもなく、DHCPによって割り当てられた動的IPアドレスもありません。したがって、システムは、ネットワーク構成が変更されたときにアプリケーションにイベントを送信するように設計されていません。アプリケーションは/etc/resolv.conf
起動時にDNS設定を一度だけ読み取ります。
ネットワーク構成の変更を処理する現代的な方法は、ローカルDNSプロキシを実行することです。もちろん、長い時間がかかりましたが、ますます多くのディストリビューションでこれをデフォルトに設定し始めました(Ubuntuは12.04からこれを始めたようです)。 127.0.0.1のみがネームサーバーとして一覧表示され、/etc/resolv.conf
DNSプロキシが設定変更を処理できるようにします。
DNS軽量DNSプロキシおよびサーバーで広く使用されている選択。他のものを選択する適切な理由がない場合は、他のものを選択してください。これがUbuntuがすることです。 MIPSプロセッサと16MBのRAMを搭載したマイホームルータもこれを実行できるため、Piは非常に強力です。
いつものように、Arch Linuxはデフォルトで動作する設定を提供しません。ウィキペディア明確で詳細な指示があります。