如何將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**來更好地控制守護程序。

更新於:2024年11月4日

瀏覽量:25

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告