嘿,完美的伺服器人員,
我想寫一個可以自我更新的 systemd 服務。
具體來說,它應該每 5 分鐘檢查一次 Amazon S3 以獲取其二進位和.service
檔案的新版本。如果它們已更新,它應該下載並替換它們,然後重新啟動。
不幸的是,我知道 systemd 不允許修改正在使用的檔案。
是否有某種標準方法可以實現這一目標?
謝謝!
編輯:為了澄清,我問是否可以透過單一服務來完成此操作。我意識到我可以有一對相互更新的服務,但這看起來不優雅。
答案1
更新與 systemd .service 檔案或程式可執行檔相關的檔案與更新任何其他檔案相同。
您確實應該使用 Ansible 等組態管理來完成此操作,但要按原樣完成,您的一般工作流程可以使用執行以下操作的 bash/python 腳本:
- 從 Web 伺服器/s3/等取得檔案。
- 您可以進行快速 md5sum 檢查來比較差異。或比較日期、其他元資料以確定文件是新的還是已更改
- 根據需要替換文件
- 如果文件正在使用中,您可能需要提前使用
stop
該服務 ( )。service <servicename> stop
- 如果文件正在使用中,您可能需要提前使用
- 執行
systemctl daemon-reload
告訴 systemd “重新掃描”服務檔案是否有任何變更。 - 重新啟動/啟動有問題的服務
然後,您可以將該腳本載入到 cron 中或作為 systemd 計時器來按計劃運行。