Linux 新增開機自啟動

牧之丨發表於2024-03-24

rc.local 方式

一、&

在 Linux 命令後加上 & 可以在後臺執行

二、nohup

對 SIGHUP 訊號免疫,對 SIGINT 訊號不免疫,可用 shopt | grep hup 檢視。

當關閉終端時,shell 預設會傳送 SIGHUP 訊號給與該終端關聯的程序,從而導致其程序跟隨終端退出。nohup 捕獲了 SIGHUP,並做了忽略處理,因此程序不會退出。

在 Linux 命令前加上 nohup 命令可以在退出帳戶/關閉終端之後繼續執行相應的程序。預設會將程序的所有輸出都重定向到一個名為 nohup.out 的檔案中。

與上面結合起來:nohup COMMAND &,這樣就能使命令永久的在後臺執行了。

三、rc.local

/etc/rc.d/rc.local 此檔案是為了相容性目的而新增的,建議建立自己的 systemd 服務或 udev 規則,在引導期間執行指令碼不是使用此檔案。

# 給許可權後,檔案中的命令才能在系統啟動後執行
chmod +x /etc/rc.d/rc.local

Systemd 方式

Systemd 簡介:https://fedoraproject.org/wiki/Systemd/zh-cn

管理自啟動服務(空格取消選中,按 TAB 切換確定):ntsysv

一、service unit 常用命令,以 mysql 服務為例

複製程式碼
# 開機啟動
systemctl enable mysqld

# 關閉開機啟動
systemctl disable mysqld

# 啟動服務
systemctl start mysqld

# 停止服務
systemctl stop mysqld

# 重啟服務
systemctl restart mysqld

# 檢視服務狀態
systemctl status mysqld
systemctl is-active sshd.service

# 結束服務程序(服務無法停止時)
systemctl kill mysqld
複製程式碼

二、服務啟動的配置檔案

配置檔案主要放在 /usr/lib/systemd/system 目錄,也可能在 /etc/systemd/system 目錄

複製程式碼
# 檢視 sshd 服務啟動檔案
systemctl cat sshd.service

# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
複製程式碼

每個服務檔案以 .service 結尾,一般會分為 3 部分,必須包含 [Service] 部分

[Unit] 啟動順序與依賴關係

複製程式碼
Description:當前服務的簡單描述
Documentation:指定 man 文件位置

After:如果 network.target 或 sshd-keygen.service 需要啟動,那麼 sshd.service 應該在它們之後啟動
Before:定義 sshd 應該在哪些服務之前啟動
注意:After 和 Before 欄位只涉及啟動順序,不涉及依賴關係。

Wants:表示 sshd.service 與 sshd-keygen.service 之間存在"弱依賴"關係,即如果"sshd-keygen.service"啟動失敗或停止執行,不影響 sshd.service 繼續執行
Requires:表示"強依賴"關係,即如果該服務啟動失敗或異常退出,那麼sshd.service 也必須退出
注意:Wants 欄位與 Requires 欄位只涉及依賴關係,與啟動順序無關,預設情況下是同時啟動。
複製程式碼

[Service] 啟動行為

複製程式碼
EnvironmentFile:許多軟體都有自己的環境引數檔案,該欄位指定檔案路徑
注意:/etc/profile 或者 /etc/profile.d/ 這些檔案中配置的環境變數僅對透過 pam 登入的使用者生效,而 systemd 是不讀這些配置的。
systemd 是所有程序的父程序或祖先程序,它的環境變數會被所有的子程序所繼承,如果需要給 systemd 配置預設引數可以在 /etc/systemd/system.conf  和 /etc/systemd/user.conf 中設定。
載入優先順序 system.conf 最低,可能會被其他的覆蓋。 Type:定義啟動型別。可設定:simple,exec,forking,oneshot,dbus,notify,idle simple(設定了 ExecStart= 但未設定 BusName= 時的預設值):ExecStart 欄位啟動的程序為該服務的主程序 forking:ExecStart 欄位的命令將以 fork() 方式啟動,此時父程序將會退出,子程序將成為主程序 ExecStart:定義啟動程序時執行的命令 上面的例子中,啟動 sshd 執行的命令是 /usr/sbin/sshd -D $OPTIONS,其中的變數 $OPTIONS 就來自 EnvironmentFile 欄位指定的環境引數檔案。類似的,還有如下欄位: ExecReload:重啟服務時執行的命令 ExecStop:停止服務時執行的命令 ExecStartPre:啟動服務之前執行的命令 ExecStartPost:啟動服務之後執行的命令 ExecStopPost:停止服務之後執行的命令 RemainAfterExit:設為yes,表示程序退出以後,服務仍然保持執行 KillMode:定義 Systemd 如何停止服務,可以設定的值如下: control-group(預設值):當前控制組裡面的所有子程序,都會被殺掉 process:只殺主程序 mixed:主程序將收到 SIGTERM 訊號,子程序收到 SIGKILL 訊號 none:沒有程序會被殺掉,只是執行服務的 stop 命令 Restart:定義了退出後,Systemd 的重啟方式。可以設定的值如下: no(預設值):退出後不會重啟 on-success:只有正常退出時(退出狀態碼為0),才會重啟 on-failure:非正常退出時(退出狀態碼非0),包括被訊號終止和超時,才會重啟 on-abnormal:只有被訊號終止和超時,才會重啟 on-abort:只有在收到沒有捕捉到的訊號終止時,才會重啟 on-watchdog:超時退出,才會重啟 always:不管是什麼退出原因,總是重啟 RestartSec:表示 Systemd 重啟服務之前,需要等待的秒數
複製程式碼

配置中多個相同配置會選擇最後一個,下面結果是 execstart2

[Service]

ExecStart=/bin/echo execstart1

ExecStart=/bin/echo execstart2

所有的啟動設定之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行

EnvironmentFile=-/etc/sysconfig/sshd,表示即使 /etc/sysconfig/sshd 檔案不存在,也不會丟擲錯誤

[Install]

WantedBy:表示該服務所在的 Target(服務組)

關於 Target,執行級別

複製程式碼
# 檢視預設 Target
systemctl get-default
# 結果為 multi-user.target,表示預設的啟動 Target 是multi-user.target。在這個組裡的所有服務,都將開機啟動。這就是為什麼 systemctl enable 命令能設定開機啟動的原因

# 檢視 multi-user.target 包含的所有服務 systemctl list-dependencies multi-user.target # 切換到另一個 target # shutdown.target 就是關機狀態 # 常用的 Target 有兩個:一個是 multi-user.target,表示多使用者命令列狀態;另一個是 graphical.target,表示圖形使用者狀態,它依賴於 multi-user.target systemctl isolate shutdown.target
複製程式碼

三、自定義服務

在 /usr/lib/systemd/system 下新建服務指令碼

複製程式碼
vim /usr/lib/systemd/system/zdy.service

[Unit]
Description=描述
Environment=環境變數或引數(系統環境變數此時無法使用)
After=network.target

[Service]
Type=forking
EnvironmentFile=所需環境變數檔案或引數檔案
ExecStart=啟動命令(需指定全路徑)
ExecStop=停止命令(需指定全路徑)
User=以什麼使用者執行命令

[Install]
WantedBy=multi-user.target
複製程式碼

新建完成後設定自啟動

# 新增或修改配置檔案後,需要重新載入
systemctl daemon-reload

# 設定自啟動,實質就是在 /etc/systemd/system/multi-user.target.wants/ 新增服務檔案的連結
systemctl enable zdy


https://www.freedesktop.org/software/systemd/man/systemd.service.html & http://www.jinbuguo.com/systemd/systemd.service.html

https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

https://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

相關文章