Systemd

systemd 中 rc.local 的正確替代品是什麼,而不是重新創建 rc.local

  • January 19, 2022

我找不到在 systemd 上執行某些本地腳本(或非常本地命令)的正確方法,我已經知道我不能為這種腳本創建服務(在 systemd 一個單元中)(或者我必須?)….

我發現的解決方法是創建 rc.local 並賦予它執行權限。

printf '#!/bin/bash \n\nexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

例如,如果我得到一個由你配置的簡單 rc.local 的舊伺服器,我會知道你做了什麼以及在發行版上升級或安裝新的東西會有多大的傷害,因為 rc.local 受到外部尊重包,但另一方面,如果我安裝一個伺服器並創建一個或兩個或三個 systemd 單元(甚至是 sysvinit 服務),只是為了做一個簡單的任務,這有時會讓你的生活變得更艱難,而且比我的單元要多得多名稱有一天可能會與發行版開發創建的新服務的名稱發生衝突,並且可能會在升級時安裝,從而給我的腳本帶來麻煩!

我看到另一個問題詢問rc.local 在哪裡,答案是創建它並授予執行權限,我認為我的問題真的不是****重複的,因為我不想知道它在哪裡 - 相信我,我只是想要接受它已被**棄用****,**但我找不到做這種事情的正確方法,我真的應該為一些簡單的事情創建一個單元嗎?

正如在別處所指出的,rc-local.servicesystemd.

  1. 從理論上講,您的發行版可能不會啟用它。(我認為這並不常見,例如因為禁用相同的建構選項也會刪除很多人使用的poweroff/命令)。reboot
  2. 語義並不完全清楚。Systemd 定義了rc-local.service一種方式,但 Debian 提供了一個插入文件,它改變了至少一個重要的設置。

rc-local.service經常可以很好地工作。如果您擔心上述問題,您需要做的就是製作自己的副本!這是魔術:

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

我認為你不需要了解每一個細節

$$ * $$,但這裡有兩件事你需要知道。

  1. 您需要使用 啟用此功能systemctl enable my-startup.service
  2. 如果您的腳本依賴於任何其他服務,包括network-online.target,您必須聲明它。例如添加一個[Unit]部分,帶有線條Wants=network-online.targetAfter=network-online.target.

您無需擔心對“早期啟動”服務的依賴——特別是之前已經訂購的服務basic.targetmy-startup.service之後會自動訂購服務basic.target,除非他們設置了DefaultDependencies=no

如果您不確定您的依賴項之一是否是“早期啟動”服務,一種方法是列出之前訂購的服務,方法是basic.target執行systemctl list-dependencies --after basic.target. (注意那是--after,不是--before)。

我認為有一些考慮因素也適用於 pre-systemd rc.local

  1. 您需要確保您的命令不會與試圖控制同一事物的另一個程序衝突。
  2. 最好不要從rc.local.

$$ * $$我使用Type=oneshot+RemainAfterExit=yes因為它對大多數一次性腳本更有意義。它正式表明您將執行一系列命令,my-startup一旦它們完成將顯示為“活動”,並且您不會啟動守護程序。

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