Ssh

在 Linux 上執行 API 服務

  • April 11, 2022

我正在連接到 AWS EC2 實例並啟動我的 API。我希望 API 繼續執行並接受請求。

那麼,tmux 是一個很好的方法嗎?或者,還有更好的方法?我的印像是 tmux 和 screen 更適合非常長的任務。不確定它們是否適合無限期地執行 API。

tmux並且screen用於保持一個或多個 shell 會話處於活動狀態,即使您ssh與目標系統的連接因任何原因中斷,和/或通過單個連接多路復用多個 shell 會話(認為它類似於能夠打開多個終端視窗,但沒有 GUI 界面)。

當然,您可以使用它tmux來執行您的 API 服務,但如果您的 AWS EC2 實例正在使用systemd(正如許多現代 Linux 發行版所做的那樣),那麼“正確”的做法可能是編寫一個*.service文件來描述啟動所需的命令 &停止您的服務及其要求(即在您的服務成功啟動之前需要執行哪些其他服務)。

然後您可以將服務文件放在/etc/systemd/system/目錄中,執行systemctl daemon-reload,然後您將能夠使用systemctl start your-API.serviceand來操作您的服務systemctl stop your-API.service。就像一個標準的系統服務——因為就其systemd而言,它將一個系統服務。

這樣做可以讓您輕鬆地為 API 指定資源限制,例如限制 API 被濫用時可能造成的損害。如果你想讓你的 API 服務自動啟動?systemctl enable your-API.service你就完成了。

您還可以在.service文件中指定您希望 API 服務在其自行崩潰或被終止時自動重新啟動。如果您讓您的 API 服務定期呼叫sd_notify(3)"WATCHDOG=1"您甚至可以systemd在服務似乎掛起時自動重啟您的服務。

還有一些安全優勢:systemd 會為它管理的每一個服務創建一個“控制組”,這個控制組被該服務創建的任何子程序繼承。因此,即使您的服務“瘋狂”並創建了 10000 個子程序(可能是因為網際網路上有人試圖濫用它),一個簡單的systemd stop your-API.service(或者systemd kill your-API.service如果您希望它立即停止並且不關心執行受控關閉您的服務)將足以清理所有這些程序:您不必考慮pkill手動pgrep查找正確程序並殺死它們的表達式。

如果您願意,systemd 也可以為chroot您提供服務(將其限制為僅查看特定目錄及其子目錄)。或者,如果您在專用於它的使用者帳戶上執行該服務(盡可能始終是一個好習慣),您可以阻止其程序(以及它們創建的任何子程序)能夠訪問完整的系統管理員權限,即使他們可能可以root通過一些漏洞利用,只需NoNewPrivileges=true*.service您的服務文件中設置即可。

有關更多資訊和範例,請在 Unix&Linux.SE 上查看此問題,或研究系統上的現有*.service文件並參考man systemd.serviceman systemd.exec了解各種關鍵字的含義。

引用自:https://unix.stackexchange.com/questions/698672