一、引言
在 Linux 系統中,設置服務開機自啟動是常見的系統配置任務。本文檔詳細介紹了多種實現服務開機自啟動的方法,包括 systemctl 方式、通用腳本方式、crontab 方案等,并提供了生產環境下的方案建議和開機啟動腳本示例。
二、systemctl 方式
2.1 適用范圍
適用于已安裝為系統服務且服務文件(.service)存儲在/usr/lib/systemd/system的組件。
2.2 設置開機啟動
使用systemctl enable xxx指令設置開機啟動,其中xxx為服務名。例如,設置mysqld服務開機啟動:
systemctl enable mysqld
會在/etc/systemd/system/xxx/(系統服務)或/etc/systemd/user/(用戶服務)下創建.service 文件的軟連接。如mysqld服務,會創建從/etc/systemd/system/multi - user.target.wants/mysqld.service到/usr/lib/systemd/system/mysqld.service的軟連接。
2.3 取消開機啟動
執行systemctl disable xxx,或者手動移除/etc/systemd/system/xxx/或/etc/systemd/user/下相應軟連接或服務文件。
2.4 查看開機啟動狀態
使用systemctl status xxx查看服務當前狀態及是否開機啟動。例如,查看mysql服務:
systemctl status mysqld
2.5 分類查看服務
查看系統中已經enable的服務:
systemctl list-unit-files --state=enabled
systemctl list-enabled
查看系統中已經disable的服務:
systemctl list-unit-files --state=disabled
systemctl list-enabled
三、chkconfig 方式
3.1 適用條件
服務腳本文件必須在/etc/init.d/目錄下,且結合/etc/rc.d/rc0.d~rc6.d目錄實現,同時服務腳本文件必須包含必要的頭部腳本代碼。
3.2 設置開機啟動
使用
chkconfig --add mysql
chkconfig --level 3 mysql on/off
其中mysqld為服務名,–level 3表示在運行級別 3 下設置開機啟動或關閉。
3.3 查看開機啟動狀態
使用
chkconfig --list mysql
四、通用腳本方式
4.1 適用范圍
不管組件是否已安裝為系統服務均適用。
4.2 方法一:追加啟動命令到默認啟動腳本
將啟動命令追加到/etc/rc.local(或/etc/rc.d/rc.local,前者是后者的軟連接)。需要先賦予/etc/rc.d/rc.local可執行權限。
chmod +x /etc/rc.d/rc.local
echo "/usr/local/your_service_start_command" >> /etc/rc.d/rc.local
4.3 方法二:編寫啟動腳本并放置在特定目錄
編寫啟動腳本.sh,放置到/etc/profile.d目錄下。腳本需設置可執行權限,如:
chmod +x /etc/profile.d/your_service_start.sh
4.4 方法三:編寫啟動腳本并追加執行指令到默認啟動腳本
編寫啟動腳本.sh,設置可執行權限后,將腳本的執行指令追加到/etc/rc.local或/etc/rc.d/rc.local。例如:
chmod +x /usr/local/your_service_start.sh
echo "/usr/local/your_service_start.sh" >> /etc/rc.d/rc.local
五、crontab 方案
5.1 適用范圍
適用于需要靈活調度任務的場景,可實現開機啟動以及按特定時間間隔執行任務。
5.2 設置開機啟動
使用@reboot關鍵字實現開機啟動功能。例如,開機時執行/usr/local/daemonProcess/somescript.sh腳本:
crontab -e
#### 在打開的文件中添加以下內容
@reboot /usr/local/daemonProcess/somescript.sh
5.3 特殊關鍵字及執行時間
@reboot:重啟時執行一次,實測比/etc/rc.d/rc.local更早執行(提前 1 - 2s),比默認 1 分鐘定時提前 30s 左右。
@yearly:一年執行一次,1 月 1 號 0 點 0 分執行,等同于@annually。
@monthly:一月執行一次,每月 1 號 0 點 0 分執行。
@weekly:一周執行一次,即"0 0 * * 0"。
@daily:一天執行一次,即"0 0 * * *"。
@hourly:一小時執行一次,即"0 * * * "。
5.4 特別注意
是否同時使用@reboot和定時任務,需根據實際業務需要決定。若守護定時設置為 1 分鐘(即 * * * *),建議不再設置@reboot,以免開機啟動后的 1 分鐘內重復執行;若守護定時間隔較大,建議同時使用@reboot,確保應用服務及時啟動。
六、生產環境開機啟動方案建議
在生產環境中,建議只采用一種開機啟動方案,確保所有組件、服務統一,便于服務較多時的快速運維。比如,有些服務默認安裝時不會自動生成系統服務,所以 systemctl 方式不能適用生產環境中所有組件、服務。如果此時按照各組件、服務分別制定開機啟動方案,則在后續如果服務啟動異常或服務發版時,就需要明確識別各服務的開機啟動方案,然后做相應的操作,提高運維成本,增加出錯概率。
七、開機啟動腳本示例
7.1 追加啟動命令到 /etc/rc.local 或 /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
# 開機啟動腳本/usr/local/AutoStartOnBoot.sh
chmod +x /usr/local/AutoStartOnBoot.sh
# 本腳本需要依賴/etc/rc.d/rc.local
# rc.local在加載環境變量之前執行,所以此處需要人工加載
source /etc/profile
八、總結
通過本文檔介紹的多種開機自啟動方案,用戶可以根據不同的服務類型和業務需求,選擇最合適的方法來實現 Linux 系統服務的開機自啟動。在生產環境中,統一的開機自啟動方案有助于降低運維成本,提高系統的穩定性和可維護性。