1. 程式人生 > 其它 >Systemd 新增python啟動項 匯入包錯誤

Systemd 新增python啟動項 匯入包錯誤

1. Systemd介紹

systemd是Linux電腦作業系統之下的一套中央化系統及設定管理程式(init),包括有守護程序、程式庫以及應用軟體,由Lennart Poettering(英語:Lennart Poettering)帶頭開發。其開發目標是提供更優秀的框架以表示系統服務(英語:Service (systems architecture))間的依賴關係,並依此實現系統初始化時服務的並行啟動,同時達到降低Shell的系統開銷(英語:Computational overhead)的效果,最終代替現在常用的System V與BSD風格init程式。
Systemd 並不是一個命令,而是一組命令,涉及到系統管理的方方面面:

2. 將Python程式加入開機啟動啟動服務

建立 /etc/systemd//system下面的xxx.service, 以我的為例/etc/systemd/system/autorecord.service,寫入如下內容。

[Unit]

Description=Files Service

After=multi-user.target

[Service]

Type=idle
ExecStart=/usr/bin/python3 /home/aitest/cv.py
Environment="PYTHON=$PYTHONPATH:/home/test/.local/lib/python3.8/site-packages"
Restart=always

[Install]

WantedBy=multi-user.target
  • 然後重新載入 systemd
sudo systemctl daemon-reload
  • 設定服務開機 自動啟動
sudo systemctl enable autorecord.service

3. 報錯內容

加入python程式需要匯入第三方包,那麼會報匯入錯誤。如下:

autorecord2.service - Files Service
     Loaded: loaded (/etc/systemd/system/autorecord2.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2022-05-17 22:28:58 CST; 11h ago
   Main PID: 2251 (code=exited, status=1/FAILURE)

5月 17 22:28:58 aitest-System-Product-Name systemd[1]: Started Files Service.
5月 17 22:28:58 aitest-System-Product-Name python3[2251]: Traceback (most recent call last):
5月 17 22:28:58 aitest-System-Product-Name python3[2251]:   File "/home/aitest/cv1.py", line 7, in <modul>
5月 17 22:28:58 aitest-System-Product-Name python3[2251]:     import ffmpeg_streaming
5月 17 22:28:58 aitest-System-Product-Name python3[2251]: ModuleNotFoundError: No module named 'ffmpeg_st>
5月 17 22:28:58 aitest-System-Product-Name systemd[1]: autorecord2.service: Main process exited, code=exi>
5月 17 22:28:58 aitest-System-Product-Name systemd[1]: autorecord2.service: Failed with result 'exit-code>

可以通過新增PYTHONPATH環境變數解決(上面示例已新增):

Environment="PYTHON=$PYTHONPATH:/home/test/.local/lib/python3.8/site-packages"

4. 參考資料

關於.service檔案的詳細配置見 阮一峰的網路日誌-Systemd 入門教程:命令篇