Systemd

自定義 systemd 服務的 shell 腳本應該安裝在哪裡?

  • February 23, 2022

我最近創建了我的第一個自定義 systemd 服務,以便在我的機器啟動序列的早期執行腳本。自定義.service文件被複製到/etc/systemd/system,據我了解,這是未通過包或作業系統分發的一部分部署的自定義服務的正確位置。

它是一種oneshot類型服務,在網路堆棧和 dhcpcd 啟動之前呼叫一個 shell 腳本來動態設置主機名。這是服務定義:

[Unit]
Description=Set hostname on startup, based on hardware serial number
Wants=local-fs.target
After=local-fs.target
Before=systemd-hostnamed.service network.target

[Service]
Type=oneshot
ExecStart=/SOMEPATH/hostname-from-serialnumber.sh

[Install]
WantedBy=systemd-hostnamed.service network.target

我不確定 shell 腳本的最佳位置是什麼,所以我SOMEPATH在上面的程式碼塊中放置了一個佔位符。這個 shell 腳本的正確位置是什麼,為什麼?

您完全正確地認為/etc/systemd/system/*.service是您的自定義服務文件的合適位置。

至於您的腳本,請將其放入/usr/local/...而不是/usr/.... 那是因為這個腳本是你寫的。以下是此約定存在的一些原因:

  • 中的文件/usr/{bin,lib,share}/歸包管理器所有。您應該能夠dpkg -S <file>pacman -Qs <file>或者rpm -q --whatprovides <file>在哪個包擁有它的任何文件上。
  • 你可以記住哪些文件是“你的”(即,如果你重建這台機器,很容易看到你需要複製什麼或者你可以簡單地從一個包中得到什麼)
  • 如果你安裝一個包,一個通用命名的腳本將不會被包覆蓋。

現在,您需要選擇下一個目錄。選項是:

  • /usr/local/bin: 如果您的腳本是可執行的(例如,已編譯的二進製文件或使用類似#!/bin/bashor的 shebang #!/usr/bin/python3)並且可以由任何使用者執行,則適用。我經常使用它,因為它非常簡單。
  • /usr/local/sbin:如果您的腳本滿足 的需求,這是合適的/usr/local/bin,但不應由使用者執行。相反,它應該只由系統管理員執行。 /usr/local/sbin通常只包含在$PATH一個sudo環境中。
  • /usr/local/lib:在某些系統(例如基於 Debian 的系統)上,此目錄可能包含不打算由使用者或 shell 腳本直接執行的內部二進製文件。但是在其他系統(即基於 Redhat 的系統)上,lib僅包括目標文件和庫。
  • /usr/local/libexec:此目錄包含不打算由使用者或 shell 腳本直接執行的內部二進製文件。這僅受某些發行版支持。
  • /usr/local/share/<ServiceName>/. 這僅適用於您的腳本不可執行且獨立於體系結構(即未編譯)的情況。您有一個*.sh腳本,但如果沒有shebang並且它不可執行,那麼您需要通過呼叫解釋器並將路徑作為參數傳遞給該腳本來執行它。 /bin/bash /path/to/script.sh. 在這種情況下,腳本可以被認為是一個只讀架構獨立的數據文件,應該放在/usr/local/share. 最好將它放在另一個子目錄下以避免混亂/usr/local/share。您選擇為您的服務編寫的任何文件也可以進入share.

引用自:https://unix.stackexchange.com/questions/691145