Systemd Service 的方式,用于在 Linux 系統上管理和運行服務。Systemd 是一個系統和服務管理器,可以自動化和簡化 Linux 系統的管理和維護,包括啟動、停止和管理后臺服務。Systemd Service 是一種用于描述和配置服務的文件格式,通常使用 .service 擴展名,它可以告訴 Systemd 如何啟動、停止、重啟和管理服務。
幾乎所有主流的 Linux 操作系統都使用 Systemd 作為默認的系統和服務管理器,因此在這些系統上,您都可以使用相同的方式來管理和運行服務。除了 Ubuntu,其他常見的 Linux 發行版,如 Debian、CentOS、Fedora、Red Hat Enterprise Linux 等都支持 Systemd。當然,不同的操作系統版本和發行版可能會有一些差異,但基本的使用方法是相同的。
1. 創建一個 .service 文件在 /etc/systemd/system/ 目錄下創建一個名為 myapp.service 的文件,使用文本編輯器打開并添加以下內容:
[Unit]
Description=My .NET 6 Web API Application
After=network.target
[Service]
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/dotnet /path/to/your/app/MyApp.dll
Restart=always
# Use the following line if you want to limit the resources used by the app
# MemoryLimit=1G
[Install]
WantedBy=multi-user.target
將 WorkingDirectory 和 ExecStart 中的路徑替換為您的應用程序的路徑。
1. 啟用和啟動服務 使用以下命令啟用和啟動服務:
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
這將啟用并啟動您的應用程序服務,使其在系統重啟后自動啟動。
1. 檢查服務狀態 使用以下命令檢查服務狀態:
sudo systemctl status myapp.service
如果一切正常,您應該看到服務已經在運行并且沒有出現錯誤。
[Unit]
部分:
? Description
提供服務的簡要描述。
? After
指定服務應在網絡目標達成后啟動。
[Service]
部分:
? WorkingDirectory
設置服務的工作目錄為應用程序的位置。
? ExecStart
指定要運行以啟動應用程序的命令。
? Restart
將服務設置為在失敗或停止時自動重新啟動。
? MemoryLimit
(在此示例中被注釋掉)限制服務可以使用的內存量。
[Install]
部分:
? WantedBy
指定此服務應該與哪個目標一起啟動。
要使用此 unit 文件,您需要將其保存為 .service 擴展名,并將其放置在 /etc/systemd/system 目錄下,然后運行 systemctl daemon-reload
命令使 systemd 意識到新服務。然后可以使用 systemctl start <service_name>
命令啟動服務,其中 <service_name>
是不帶 .service 擴展名的 unit 文件的名稱。
要停止一個使用 systemd 守護的 .NET 應用程序,您可以使用以下命令:
--重載
sudo systemctl daemon-reload
--開始
sudo systemctl status miniapi.service
--停止
sudo systemctl stop miniapi.service
--禁用 [此命令將停止應用程序的進程并停止服務。如果您希望在下次系統啟動時保持應用程序不再運行]
sudo systemctl disable miniapi.service
--重啟
sudo systemctl restart miniapi.service
如需守護多個應用,更改應用名稱重復操作就可以了,筆者這里經過半天將三個net項目成功遷移到linux服務器上面,包括nginx,數據庫,ssl證書申請續簽等等...
這里放下遷移好后的微信小程序鏈接【NET7微信小程序展示】,目前小程序算是個半成品,后面做好的話會開源出來,因為微信文章的限制不容易更改文章,目前搭建了一個在線的Dotnet知識庫,后面也會開放出來,最后感謝大家的關注。
在Linux系統中,進程管理是一項重要的任務。了解如何判斷一個進程是否仍在運行對于系統管理和腳本編寫都非常有用。本文將介紹如何使用Bash腳本判斷進程是否仍在運行,并探討了一些相關問題和最佳實踐。
要判斷一個進程是否仍在運行,可以使用kill命令發送信號給該進程。而作為一種便利的方法,我們可以使用不存在的信號"0"來判斷進程是否仍在運行。下面是一個示例的Bash腳本:
# Bourne
myprog & # 在后臺啟動程序
daemonpid=$! # ...并保存其進程ID
while sleep 60
do
if kill -0 $daemonpid # 進程是否仍存活?
then
echo >&2 "OK - 進程仍在運行"
else
echo >&2 "ERROR - 進程 $daemonpid 已經停止運行!"
break
fi
done
這段腳本首先在后臺啟動了一個程序(myprog?),并保存其進程ID。然后,通過循環定時檢查進程是否仍在運行,使用kill -0?命令來判斷進程是否存活。如果進程仍在運行,會輸出"OK - 進程仍在運行";如果進程已經停止運行,會輸出"ERROR - 進程 $daemonpid 已經停止運行!"并跳出循環。
需要注意的是,使用進程ID(PID)來標識進程存在一些缺陷。當一個進程終止后,其PID的含義是不確定的,后續啟動的進程可能會使用相同的PID。因此,除了父進程之外,其他進程不應嘗試管理該進程。
通常,判斷一個進程是否仍在運行只是一個表面問題,往往隱藏著更深層次的問題。比如,希望確保一個經常崩潰的守護進程仍在運行。對于這種情況,最好的解決方法是修復程序或其配置,以使其停止崩潰。如果無法解決問題,可以使用以下代碼片段來重新啟動進程:
# POSIX
while true
do
myprog && break
sleep 1
done
這段代碼會在myprog?以非0的退出碼終止時重新啟動它。如果退出碼為0,表示進程正常關閉,循環結束。需要注意的是,myprog?必須在前臺運行,如果它自動將自己"守護化"(daemonize),那么這種方法可能無效。
進程管理是系統管理和腳本編寫中的重要任務之一。通過學習如何判斷進程是否仍在運行,并了解相關問題和最佳實踐,可以更好地管理和控制進程。請記住,在使用進程ID標識進程時存在一些缺陷,除了父進程之外,其他進程應避免嘗試管理進程。
如果您覺得文章內容對你有一點幫助可以關注我,我在頭條平臺會持續分享更多實用的shell技巧和最佳實踐,如果想系統的快速學習shell的各種高階用法和生產環境避坑指南可以看看《shell腳本編程最佳實踐》專欄,專欄里有更多的實用小技巧和腳本代碼分享。