起動時にデーモンのシステム単位ファイルが機能しません。

起動時にデーモンのシステム単位ファイルが機能しません。

Raspberry PiモデルBtransmission-daemonで起動しようとしています。systemdこれでデーモンを停止して起動できますが、systemctl起動時の自動起動はまだ正しく機能しません。

ユニットファイルを作成しました/etc/systemd/system/transmission.service

[Unit]
Description=Transmission daemon
Requires=network.target

[Service]
Type=forked
User=pi
ExecStart=/usr/bin/transmission-daemon -f

[Install]
WantedBy=multi-user.target

以下を使用してサービスを有効にしました。

sudo systemctl enable transmission.service

残念ながら…再起動するのは楽しいことではありません。しかし、手動で起動すると動作します。

sudo systemctl start transmission.service

私は何が間違っていましたか?私は最新のRaspbian Jessieを使用しています。

編集(2015/10/16)

ps auxとの出力によると、systemctl status transmission.serviceデーモンは実行中です。ただし、Web インターフェイスにアクセスできません。実行中のデーモンインスタンスを停止して手動で再起動すると、Webインターフェイスにアクセスできます。

要求に応じてPiを再起動した後の出力は次のとおりですps auxnetstat

https://dl.dropboxusercontent.com/u/29638164/ps_before.txt https://dl.dropboxusercontent.com/u/29638164/netstat_before.txt

以下は、デーモンを手動で再起動した後の同じ出力です。

https://dl.dropboxusercontent.com/u/29638164/ps_after.txt https://dl.dropboxusercontent.com/u/29638164/netstat_after.txt

使用して:

$ killall transmission-daemon
$ sudo systemctl start transmission.service

答え1

Requires=network.targetsystemdサービスはある時点でアクティブなネットワーク接続が必要であることを知らせます。このサービスのみを開始するように指定されていません。後ろにネットワークが起動しました

(はい、サービスの実行中にネットワークインターフェイスの表示、再構成、および/または消失を処理できるサービスがあります。これらのサービスではうまく機能します。Requires=network.target現代社会では、ホットプラグとIPv6がますます一般的になっています。これと同じでなければなりません)。

マニュアルページでsystemd.unit(5)(ハイライト):

需要依存性は、サービスの開始または停止の順序には影響しません。これはAfter=、またはオプションを使用して独立して設定する必要がありますBefore= 。デバイスに次foo.serviceのように構成されたデバイスが必要で、順序が使用または構成されていない場合bar.serviceRequires=After=Before=両方のデバイスが同時に起動しますfoo.service有効にすると、2 つの間に遅延はありません。失敗したサービスを処理するときによりWants=強力なシステムを実装するには、代わりに使用する方が良い選択肢が多いです。Requires=

ネットワークが起動し、すべてのインターフェイスにIPアドレスが付与された後にのみサービスを開始するように指定するには、次の手順を実行する必要があります。

Wants=network-online.target
After=network-online.target

systemd.special(7)マニュアルページから:

network-online.target

ネットワーク接続を厳密に構成する必要があるデバイスは、タイプの依存関係を介してインポートし、network-online.targetその後Wants=自分でソートする必要があります。このターゲットデバイスは、ネットワークが十分に構築されるまで追加の実行を延期するサービスを取得するように設計されています。具体的に必要なのは、ネットワーク管理サービスの実装に依存する。

答え2

ネットワークインターフェイスがまだIPアドレスを取得していないため、トランスポートデーモンはポートをバインドできません。 IPアドレスが192.168.xxx.xxxであると仮定すると、次のコマンドを使用してTransmission-daemon systemdデバイスにExecStartPreオプションを追加することで問題を解決できます。

ExecStartPre=/usr/bin/timeout 120 sh -c "until ifconfig | grep -m 1 '192\.168'; do sleep 1 ; done"

詳細を確認できますここ

関連情報