如何在Udev事件中執行長時間程序
介紹
Udev是現代Linux系統使用的裝置管理器。它檢測硬體更改並管理/dev目錄中的裝置節點。Udev提供了一種靈活的方式來響應裝置事件執行指令碼或程式。此功能可用於執行各種任務,例如自動掛載、啟動備份指令碼和執行長時間執行的程序。在本文中,我們將討論如何在Udev事件中執行長時間程序,並提供示例來說明這些概念。
理解Udev規則
Udev規則是指定Udev如何處理裝置事件的檔案。一個典型的規則由四個部分組成:匹配、動作、條件和可選註釋。匹配標識規則應應用於的裝置或裝置。動作指定在找到匹配項時要執行的命令或指令碼。條件是一個可選測試,必須為真才能使規則匹配。註釋是對規則的描述。
這是一個簡單的Udev規則示例:
# /etc/udev/rules.d/10-example.rules ACTION=="add", SUBSYSTEM=="block", KERNEL=="sda", RUN+="/usr/local/bin/myscript.sh"
此規則在新增核心名為“sda”的塊裝置時匹配,並執行指令碼“/usr/local/bin/myscript.sh”。“RUN”關鍵字指定應非同步執行命令。
在Udev事件中執行長時間程序
要在Udev事件中執行長時間程序,我們需要修改Udev規則以在後臺啟動程序。這可以使用命令末尾的“&”字元來完成。這將在後臺執行命令,並立即將控制權返回給shell。
這是一個啟動長時間執行程序的Udev規則示例:
# /etc/udev/rules.d/11-longtimeprocess.rules ACTION=="add", SUBSYSTEM=="block", KERNEL=="sda", RUN+="/usr/local/bin/longtimeprocess.sh &"
此規則在新增核心名為“sda”的塊裝置時匹配,並在後臺執行指令碼“/usr/local/bin/longtimeprocess.sh”。
在此示例中,我們假設指令碼“/usr/local/bin/longtimeprocess.sh”將執行很長時間。如果指令碼快速完成,則指令碼執行完畢前Udev事件將完成。
如果我們需要在完成Udev事件之前等待長時間執行的程序完成,可以使用“wait”命令。“wait”命令將等待從當前shell啟動的所有後臺程序完成。
這是一個等待長時間執行的程序完成的Udev規則示例:
# /etc/udev/rules.d/12-waitlongtimeprocess.rules ACTION=="add", SUBSYSTEM=="block", KERNEL=="sda", RUN+="/usr/local/bin/waitlongtimeprocess.sh & wait"
此規則在新增核心名為“sda”的塊裝置時匹配,並在後臺執行指令碼“/usr/local/bin/waitlongtimeprocess.sh”。“wait”命令等待指令碼完成,然後完成Udev事件。
使用Systemd管理長時間執行的程序
Systemd是Linux系統的系統和服務管理器。它提供了一種管理長時間執行的程序的方法,包括啟動、停止和重新啟動它們。
我們可以使用systemd來管理從Udev事件啟動的長執行程序。為此,我們需要建立一個systemd服務單元檔案來描述長時間執行的程序。然後,我們可以修改Udev規則以啟動systemd服務,而不是直接啟動程序。
這是一個systemd服務單元檔案示例:
# /etc/systemd/system/longtimeprocess.service [Unit] Description=Long Time Process [Service] ExecStart=/usr/local/bin/longtimeprocess.sh Restart=on-failure [Install] WantedBy=multi-user.target
此檔案描述了一個名為“longtimeprocess”的服務,該服務執行指令碼“/usr/local/bin/longtimeprocess.sh”。“Restart”選項指定如果服務失敗,則應重新啟動它。
要從Udev事件啟動服務,我們可以修改Udev規則以使用“systemctl”命令啟動服務:
# /etc/udev/rules.d/13-systemdlongtimeprocess.rules ACTION=="add", SUBSYSTEM=="block", KERNEL=="sda", RUN+="/bin/systemctl start longtimeprocess.service"
此規則在新增核心名為“sda”的塊裝置時匹配,並啟動“longtimeprocess.service”systemd服務。
使用systemd管理長時間執行的程序具有許多好處。例如,如果服務失敗或系統重新啟動,systemd可以自動重啟程序。它還提供了一種標準化的方法來管理和監控長時間執行的程序。
除了啟動長時間執行的程序外,Udev規則還可以用於執行各種各樣的任務。例如,Udev規則可用於自動掛載USB驅動器,在檢測到新硬碟時啟動備份指令碼,或在新增新網路介面時更新網路配置。
要建立有效的Udev規則,重要的是要了解系統上的裝置和子系統。“udevadm”命令可用於查詢Udev資料庫並檢查裝置的屬性。例如,命令“udevadm info -a -p /sys/class/block/sda”可用於檢視“sda”塊裝置的屬性。
建立Udev規則時,還務必徹底測試規則,以確保它們按預期工作。“udevadm”命令可用於模擬Udev事件並測試規則,而無需實際插入裝置。例如,命令“udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1”可用於測試匹配第一個硬碟的“sda1”分割槽的Udev規則。
在Udev規則中使用描述性註釋也很重要,以便更容易理解其目的和功能。如果多個管理員正在使用同一個系統,或者將來需要更新規則,這將特別有用。
結論
在本文中,我們討論瞭如何在Udev事件中執行長時間程序。我們提供了啟動長時間執行程序並等待它們完成的Udev規則示例。我們還討論瞭如何使用systemd來管理從Udev事件啟動的長執行程序。
使用Udev啟動長時間執行的程序時,務必確保程序在後臺執行,以便Udev事件可以快速完成。還必須考慮是否應由systemd管理程序以提供自動重啟和標準化管理。
Udev提供了一種靈活的方式來響應硬體事件並啟動指令碼或程式。透過理解Udev規則並有效地使用它們,我們可以自動化許多工,並提高Linux系統的可靠性和效率。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP