コマンドラインでは完全に機能しますが、systemd ExecStartを介して実行することはできません。

コマンドラインでは完全に機能しますが、systemd ExecStartを介して実行することはできません。

私はインストールしました蝶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ユニットを作成して、デーモンが魔法のようにソケットを有効にできないようにすることはできません。ソケットの有効化をサポートするには、そのコードを変更する必要があります。

おすすめ記事