
私はインストールしました蝶httpターミナルサーバー、私のArchマシンでPythonで書かれました。私はsystemdを初めて使用していますが、コマンドラインパラメータの1つに問題があります。
/usr/bin/butterfly.server.py --shell=/usr/fish --unsecure --host="0.0.0.0"
これは期待どおりに機能し、他のコンピュータのWebブラウザを介して端末にアクセスできます。
しかし、単純なシステム.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
シェルから蝶を起動すると、一重引用符が削除されます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]