如何將Bash指令碼作為守護程序執行?
有時,我們需要執行自動化流程,為此,我們使用一個在後臺持續執行的指令碼。在Linux中,這類指令碼被稱為“守護程序”。這些守護程序允許我們獨立於終端會話執行。這意味著即使我們關閉會話,指令碼也會繼續執行。
在本教程中,我們將學習如何**將Bash指令碼轉換為守護程序**。
什麼是守護程序?
守護程序只是一個在後臺持續執行的程式或程序,無需使用者互動。在您日常的Linux任務中,您可能已經使用過一些這樣的程序。例如,如果您使用像MySQL或Postgres這樣的資料庫,它們就有這樣的服務。
例如,要啟動Postgres,您可以說service Postgres start。此命令的作用是在後臺執行一個服務(守護程序)來啟動資料庫,並且它會一直執行直到您停止它。這是一個守護程序的真實示例。
**系統需要守護程序在後臺執行一些服務和任務**。要檢視系統中正在執行的所有守護程序,請執行以下命令:
ps axl
這將列出系統中所有正在執行的守護程序。
將Bash指令碼作為守護程序執行
Bash指令碼是一種強大的指令碼語言,允許我們自動化任務,而使用守護程序可以為我們帶來更多好處,例如自動化重複性任務並確保我們的指令碼在後臺持續執行。這還允許我們專注於其他任務,因為我們的守護程序與會話分離。
讓我們一起學習將簡單的Bash指令碼轉換為守護程序的步驟和方法。
首先,讓我們建立一個簡單的Bash指令碼檔案,例如:
#!/bin/bash i=0 while true; do echo "Running ... $i" ((i++)) sleep 10 done
我們建立一個示例,它每10秒列印一次“正在執行...”訊息,並每次遞增變數i。
終端會話
當我們使用終端會話時,如果我們關閉終端視窗(會話),則此會話中的所有程序都將被殺死。例如,如果您執行這樣的程序:
sleep 300 &
這將在後臺執行**sleep**命令,您可以使用**jobs**命令檢視後臺執行的程序。但是,如果您關閉終端並再次開啟它,您會看到該程序已被殺死,因為它附加到當前的shell會話。您可以使用**pstree**命令檢查這一點,該命令顯示程序的父程序。例如:
pstree -s 6542
在這裡,我們將程序ID傳遞給**pstree**,它將顯示如下輸出:
systemd───systemd───gnome-terminal───bash───sleep
在這種情況下,**sleep**命令的父程序是**bash**,而**bash**的父程序是終端本身,在我的例子中是**gnome-terminal**。
使用nohup建立守護程序
為了將指令碼或程序轉換為守護程序,我們將使用一個名為**nohup**的工具,它代表“no hang up”(不掛起)。此命令採用如下選項:
nohup path/script.sh > /dev/null 2>&1 &
讓我們解釋一下它的作用:
- **path/script** - 我們需要轉換為守護程序的檔案。
- **/dev/null 2>$1** - 將所有輸出重定向到/dev/null,防止指令碼阻塞。
- **&** - 這將使指令碼在後臺執行。
使用Systemd
我們可以使用systemd(幾乎所有發行版中都可用的系統和服務管理器)來更好地控制您的守護程序。
為此,請在** /etc/systemd/myexample.service** 位置建立一個服務單元檔案:
[Unit] Description=My Script Daemon [Service] ExecStart=/path_to_script.sh Restart=always User=root StandardOutput=null StandardError=null [Install] WantedBy=multi-user.target
這將使我們更好地控制守護程序。
要啟用並啟動服務,我們使用以下命令:
sudo systemctl enable myexample.service sudo systemctl start myexample.service
管理守護程序
使用**systemd**將為我們提供一些管理服務(守護程序)的命令。
要啟動守護程序,請使用以下命令:
sudo systemctl start myexample.service
要停止守護程序,請使用以下命令:
sudo systemctl stop myexample.service
您可以使用以下命令檢查守護程序的狀態:
sudo systemctl stop myexample.service
結論
在本教程中,我們討論瞭如何將簡單的Bash指令碼轉換為守護程序。我們使用了兩種方法:一種是使用**nohup**命令的簡單方法,另一種是使用**systemd**來更好地控制守護程序。