編寫有趣且有價值的 Systemd 服務

Documentation= https://wiki.minetest.net/Main_Page

[Service]

Type= simple

ExecStart= /usr/games/minetest --server

可以看到該單元中包含不同的段,其中 [Unit] 段主要為用戶提供信息,給出該單元的描述及如何獲得更多相關文檔。

腳本核心位於 [Service] 段,首先使用 Type 指令確定服務類型。服務 有多種類型 ,下面給出兩個示例。如果你運行的進程設置環境變量、調用另外一個進程(主進程)、退出運行,那麼你應該使用的服務類型為 forking。如果你希望在你的單元對應進程結束運行前阻斷其他單元運行,那麼你應該使用的服務類型為 oneshot。

但 Minetest 服務器的情形與上面兩種都不同,你希望啟動服務器並使其在後臺持續運行;這種情況下應該使用 simple 類型。

下面來看 ExecStart 指令,它給出 systemd 需要運行的程序。在本例中,你希望在後臺運行 minetest 服務器。如上所示,你可以在可執行程序後面添加參數,但不能將一系列 Bash 命令通過管道連接起來。下面給出的例子無法工作:

ExecStart: lsmod | grep nvidia > videodrive.txt

如果你需要將 Bash 命令通過管道連接起來,可以將其封裝到一個腳本中,然後運行該腳本。

還需要注意一點,systemd 要求你給出程序的完整路徑。故如果你想使用 simple 類型運行類似 ls 的命令,你需要使用 ExecStart= /bin/ls。

另外還有 ExecStop 指令用於定製服務終止的方式。我們會在第二部分討論這個指令,但你要了解,如果你沒有指定 ExecStop,systemd 會幫你儘可能友好地終止進程。

systemd.directives 的幫助頁中包含完整指令列表,另外你可以在該 網站 上找到同樣的列表,點擊即可查看每個指令的具體信息。

雖然只有 6 行,但你的 minetest.service 已經是一個有完整功能的 systemd 單元。執行如下命令啟動服務:

systemd --user start minetest

執行如下命令終止服務:

systemd --user stop minetest

選項 --user 告知 systemd 在你的本地目錄中檢索服務並用你的用戶權限執行服務。

我們的服務器管理故事到此完成了第一部分。在第二部分,我們將在啟動和終止服務的基礎上,學習如何給用戶發郵件、告知用戶服務器的可用性。敬請期待。

可以通過 Linux 基金會和 edX 的免費課程 “ Linux 入門 ”學習更多 Linux 知識。


via: https://www.linux.com/blog/learn/intro-to-linux/2018/5/writing-systemd-services-fun-and-profit


分享到:


相關文章: