Linux 服務器被設計為始終工作; 而不是手動啟動重要的程序並將它們留在 tmux
會話,您需要將它們添加到 systemd
作為一項服務,它將在啟動時自動啟動,並在發生錯誤時重新啟動。
Systemd 將服務的配置存儲在兩個地方。 第一個是 /lib/systemd/system/
,您可以在其中找到系統上許多服務的配置。 大多數軟件安裝都在這里安裝服務。 第二個是 /etc/systemd/system/
這取消了 /lib/systemd
目錄,一般用於放置用戶創建的服務。 還有 /etc/systemd/users/
它為單個登錄用戶運行服務,例如獲取郵件。
其中許多服務並不像 nginx 或 MySQL 會做。 您可以打印當前正在使用的服務列表:
service --status-all
帶“+”符號的服務正在運行,帶“-”符號的服務當前已停止。 您可以通過以下方式查看更詳細的信息:
service status nginx
由於服務在後台運行,因此它們不會將輸出記錄到控制台,而是將輸出記錄到 systemd 日誌。 “status”命令將顯示該日誌的最後幾行,但您可以直接使用以下命令讀取它:
journalctl -fn 50 -u nginx
此命令打印 50 個最近的日誌條目(-n
)來自 nginx 服務(-u
)。 它被配置為打印所有內容並從底部開始,跟踪創建的新日誌條目(-f
)。
當然,許多應用程序仍然會將大部分內容寫入其訪問或錯誤日誌,因此請務必檢查這些日誌。 日誌會跟踪直接記錄到控制台的內容,這對於調試您自己的服務非常有用。
簡單的服務設置
Systemd 用於許多事情 Linux; 它驅動的每個對象稱為一個單元,並且有一個相應的“單元文件”來定義它們是什麼。 這些可以是簡單的服務,例如 nginx 或 MySQL,也可以是掛載點、設備、套接字等 還有很多其他的事情,全部由systemd管理。 單位也可以 目標用於控制其他服務何時運行(即在網絡初始化之後)。
但是,對於此用例,您可能只想將應用程序配置為基本服務。 為此,您需要創建一個新的驅動器文件,並將其放置在 /etc/systemd/system/
並命名為 .service
擴大:
touch /etc/systemd/system/myapp.service
單元文件有幾個不同的部分,但一般來說它們看起來像這樣:
[Unit] Description=Example Service After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=serviceuser ExecStartPre= ExecStart=/path/to/executable [options] ExecStartPost ExecStop= ExecReload= [Install] WantedBy=multi-user.target
首先, [Unit]
部分,它定義了一系列有關驅動器的元數據。 他 After=
指令可用於延遲驅動器激活,直到啟動另一個驅動器,例如 network
或其他服務,例如 mysql.service
這並不會讓您嚴格依賴該服務,儘管您可以使用 Requires=
哦 Wants=
指令。 此部分還配置了 systemd 完全放棄之前單元嘗試啟動的最大次數; 因為您可能希望它繼續嘗試,所以您可以將其設置為 0 以禁用此行為。
接下來是 [Service]
部分,特定於服務單元文件。 您將在此處配置 Exec 選項。 User
將以給定用戶身份運行該服務。 您可以將其設置為您的個人用戶帳戶、root 或自定義服務帳戶。 只需確保用戶有足夠的權限來完成他們的工作即可。
這裡有一些不同的指令來指定要運行的程序。 ExecStartPre
它將首先運行,允許您在服務實際啟動之前進行任何必要的配置。 ExecStart
是主要的可執行文件。 ExecStartPost
追趕,並且 ExecStop
當服務關閉時運行。 ExecReload
是一個特殊指令,當您調用“reload”而不是重新啟動時使用。 這允許您在運行時執行配置重新加載,只要您的應用程序具有此功能。
最後, [Install]
部分,它定義了與 systemd 處理單元的方式相關的更多行為。 這最常用於指定 WantedBy=
指令,用於告訴 systemd 何時啟動其服務,並在目標及其依賴單元之間創建符號鏈接。 如果您不確定使用哪個鏡頭, multi-user.target
幾乎所有內容都加載後,它將在啟動時運行服務。
一般來說,設置非常簡單,您真正要做的就是將可執行文件作為參數傳遞給 [Service]
部分。 創建服務後,您需要重新加載 systemctl 守護進程以更新您的更改:
sudo systemctl daemon-reload
並啟用它(這將在啟動時運行它,具體取決於驅動器配置):
sudo systemctl enable myapp
然後啟動服務:
sudo service myapp start
該服務現在應該在後台運行,您可以檢查 journalctl
查看你的輸出。 如果它出來了 systemd
它會再次自動啟動它,並且它應該在啟動時與系統上的其他服務一起運行。
如果您需要重新啟動服務,可以使用:
sudo service myapp restart
這將執行 ExecStop=
指令,關閉設備並再次打開。