我已經使用 python 和 bottle 和一個 systemd 單元撰寫了一個小服務器,將它作為服務安裝在 xubuntu 上。python 腳本按預期作業,如果我從命令列 ( sudo systemctl advairMeter) 啟動它,該服務作業正常,但它在系統啟動時失敗。
這是我的 .service 檔案:
saul@linuxBox:~/Desktop$ cat /etc/systemd/system/advairMeter.service
[Unit]
Description=Advair meter
After=network.target
[Service]
ExecStart=/usr/bin/python3 server.py
Restart=always
WorkingDirectory=/home/saul/Projects/PythonProjects/medSched/
[Install]
WantedBy=multi-user.target
這是重新啟動時發生的情況:
Apr 09 08:43:49 linuxBox systemd[1]: Started Advair meter.
Apr 09 08:43:49 linuxBox python3[1176]: Bottle v0.12.19 server starting up (using WSGIRefServer())...
Apr 09 08:43:49 linuxBox python3[1176]: Listening on http://192.168.1.103:8080/
Apr 09 08:43:49 linuxBox python3[1176]: Hit Ctrl-C to quit.
Apr 09 08:43:50 linuxBox python3[1176]: Traceback (most recent call last):
Apr 09 08:43:50 linuxBox python3[1176]: File "server.py", line 95, in <module>
Apr 09 08:43:50 linuxBox python3[1176]: run(host='192.168.1.103', port=8080)
Apr 09 08:43:50 linuxBox python3[1176]: File "/usr/local/lib/python3.8/dist-packages/bottle.py", line 3137, in run
Apr 09 08:43:50 linuxBox python3[1176]: server.run(app)
Apr 09 08:43:50 linuxBox python3[1176]: File "/usr/local/lib/python3.8/dist-packages/bottle.py", line 2789, in run
Apr 09 08:43:50 linuxBox python3[1176]: srv = make_server(self.host, self.port, app, server_cls, handler_cls)
Apr 09 08:43:50 linuxBox python3[1176]: File "/usr/lib/python3.8/wsgiref/simple_server.py", line 154, in make_server
Apr 09 08:43:50 linuxBox python3[1176]: server = server_class((host, port), handler_class)
Apr 09 08:43:50 linuxBox python3[1176]: File "/usr/lib/python3.8/socketserver.py", line 452, in __init__
Apr 09 08:43:50 linuxBox python3[1176]: self.server_bind()
Apr 09 08:43:50 linuxBox python3[1176]: File "/usr/lib/python3.8/wsgiref/simple_server.py", line 50, in server_bind
Apr 09 08:43:50 linuxBox python3[1176]: HTTPServer.server_bind(self)
Apr 09 08:43:50 linuxBox python3[1176]: File "/usr/lib/python3.8/http/server.py", line 138, in server_bind
Apr 09 08:43:50 linuxBox python3[1176]: socketserver.TCPServer.server_bind(self)
Apr 09 08:43:50 linuxBox python3[1176]: File "/usr/lib/python3.8/socketserver.py", line 466, in server_bind
Apr 09 08:43:50 linuxBox python3[1176]: self.socket.bind(self.server_address)
Apr 09 08:43:50 linuxBox python3[1176]: OSError: [Errno 99] Cannot assign requested address
Apr 09 08:43:50 linuxBox systemd[1]: advairMeter.service: Main process exited, code=exited, status=1/FAILURE
Apr 09 08:43:50 linuxBox systemd[1]: advairMeter.service: Failed with result 'exit-code'.
Apr 09 08:43:50 linuxBox systemd[1]: advairMeter.service: Scheduled restart job, restart counter is at 4.
Apr 09 08:43:50 linuxBox systemd[1]: Stopped Advair meter.
現在上面的 journalctl 輸出的第一部分,
Bottle v0.12.19 server starting up (using WSGIRefServer())...
Listening on http://192.168.1.103:5678/
Hit Ctrl-C to quit.
如果我只是用 運行 python 腳本,我看到的是python3 server.py,所以看起來腳本實際執行了,然后無法分配地址是有道理的,因為已經有一個套接字在使用它,但是為什么不重新啟動完成后,是否有一個行程正在監聽該帖子?
python腳本本身很簡單,
<SNIP>
@route('/')
@auth_basic(is_authenticated_user)
def home():
<SNIP>
run(host='192.168.1.103', port=8080)
I assume the mistake is in my .service file, but I haven't been able to find anything on the web that tells me how to fix it. This is my first experience with both bottle and systemd, so I'm likely making a very simple error.
uj5u.com熱心網友回復:
在啟動期間設定網路之前,您的服務很有可能正在運行。這意味著您的作業系統沒有任何網路介面可以監聽,因此您的腳本會失敗。要解決此問題,請將您的[Unit]部分更改為:
[Unit]
Description=Advair meter
Wants=network-online.target
After=network.target network-online.target
您可以檢查是否在網路啟動后執行腳本?更多細節。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/457895.html
標籤:python linux systemd bottle
