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 aux
。netstat
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.target
systemd
サービスはある時点でアクティブなネットワーク接続が必要であることを知らせます。このサービスのみを開始するように指定されていません。後ろにネットワークが起動しました。
(はい、サービスの実行中にネットワークインターフェイスの表示、再構成、および/または消失を処理できるサービスがあります。これらのサービスではうまく機能します。Requires=network.target
現代社会では、ホットプラグとIPv6がますます一般的になっています。これと同じでなければなりません)。
マニュアルページでsystemd.unit(5)
(ハイライト):
需要依存性は、サービスの開始または停止の順序には影響しません。これは
After=
、またはオプションを使用して独立して設定する必要がありますBefore=
。デバイスに次foo.service
のように構成されたデバイスが必要で、順序が使用または構成されていない場合bar.service
Requires=
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"
詳細を確認できますここ