![コマンドラインでは完璧に動作しますが、systemd ExecStartでは動作しません。](https://rvso.com/image/36000/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%AF%E5%AE%8C%E7%92%A7%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81systemd%20ExecStart%E3%81%A7%E3%81%AF%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82.png)
インストールしましたバタフライ http ターミナル サーバー、Arch マシンで Python で書かれています。私は systemd を初めて使うのですが、コマンド ライン パラメータの 1 つに問題があります。
/usr/bin/butterfly.server.py --shell=/usr/fish --unsecure --host="0.0.0.0"
これは期待どおりに動作し、別のマシンの Web ブラウザーを介してターミナルにアクセスできます。
ただし、そのために単純な systemd .service を作成すると、次のようになります。
[Unit]
Description=Butterfly Terminal Server
[Service]
ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure
[Install]
WantedBy=multi-user.target
--host="0.0.0.0"
ExecStart 行では開始されず、次のように報告されます。
[root@ArchHP sockets.target.wants]# systemctl status butterfly.service -l
● butterfly.service - Butterfly Terminal Server
Loaded: loaded (/usr/lib/systemd/system/butterfly.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2015-01-07 23:08:29 CST; 26s ago
Process: 3203 ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure (code=exited, status=1/FAILURE)
Main PID: 3203 (code=exited, status=1/FAILURE)
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/tcpserver.py", line 125, in listen
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: sockets = bind_sockets(port, address=address)
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/netutil.py", line 106, in bind_sockets
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: 0, flags)):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/socket.py", line 530, in getaddrinfo
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: socket.gaierror: [Errno -2] Name or service not known
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service: main process exited, code=exited, status=1/FAILURE
Jan 07 23:08:29 ArchHP systemd[1]: Unit butterfly.service entered failed state.
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service failed.
その後、 を削除すると--host="0.0.0.0"
、正常に起動しますが、ローカル マシンでのみアクセス可能になり、他のコンピューターにはアクセスが許可されません。その後、サービス用の butterfly.socket を作成しようとしましたが、エラー メッセージの検索に成功しませんでした。
ExecStart で実行するのとコマンドラインで実行するのとで何が違うのでしょうか。また、そのパラメータで起動するにはどうすればいいのでしょうか。最後の手段として、 をデフォルトにするように Python スクリプトを変更してみることもできますが、 ではエラーが発生するのに、直接実行したときには0.0.0.0
エラーが発生しない理由を理解したいと思います。sudo systemctl restart butterfly.service
答え1
シェルから butterfly を起動すると、 の周りの引用符が削除されます0.0.0.0
。一方、 systemd はシェルではないため、この状況では引用符の展開は行われません。
実際、systemdは引用符を取り除くことができる。その周り議論の最中ではなく、議論の途中です。
したがって、0.0.0.0
サービス ファイル内の引用符を削除して、何が変わるか確認してみてください。 を忘れないでくださいsystemctl daemon-reload
。
PS: .socket ユニットを記述するだけでは、デーモンを魔法のようにソケット アクティベート可能にすることはできません。ソケット アクティベーションをサポートするには、デーモンのコードを変更する必要があります。
答え2
を実行するには、いくつかの依存関係があると思いますbutterfly.service
。コマンド ラインから実行しているときは、すべてのサービスが起動していて、問題は発生していませんが、から起動しているときは、systemd
依存関係サービスの一部が起動していない可能性があり、それらのサービスが起動する前に起動します。セクションにyour butterfly.service
追加してみてください。クラッシュした場合は、再起動するはずです。Restart=always
[service]