一.系統服務
如果組件已經安裝為系統服務,默認服務文件為 xxx.service,存儲在 /usr/lib/systemd/system
可以使用以下2種方式設置開機啟動
systemctl方式
systemctl enable/disable xxx 指令設置/取消開機啟動 --查看是否開機啟動 [root@localhost system]# systemctl status chronyd.service ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2022-07-28 1839 CST; 4 months 4 days ago Docs: man:chronyd(8) man:chrony.conf(5) Main PID: 790 (chronyd) Memory: 1.0M CGroup: /system.slice/chronyd.service └─790 /usr/sbin/chronyd systemctl list-unit-files # 查看服務的自啟動狀態以list-unit-files為準 # 但是系統服務太多,我想分類查看該如何做? # 查看系統中已經enable的服務 systemctl list-unit-files --state=enabled 或 systemctl is-enabled # 查看系統中已經disable的服務 systemctl list-unit-files --state=disabled 或 systemctl is-enabled # --state還可以與list-units結合使用,具體可使用以下命令查詢用法 systemctl --state=help
chkconfig方式(較復雜)
chkconfig --add xxx && chkconfig --level 3 xxx on/off,本方式要求服務腳本文件必須在 /etc/init.d/ 目錄下,且結合 /etc/rc.d/rc0.d~rc6.d目錄實現,同時服務腳本文件必須包含必要的頭部腳本代碼,較復雜 --查看是否開機啟動 chkconfig --list network 注:該輸出結果只顯示 SysV 服務,并不包含原生 systemd 服務。SysV 配置數據可能被原生 systemd 配置覆蓋。 要列出 systemd 服務,請執行 'systemctl list-unit-files' 查看在具體 target 啟用的服務請執行 'systemctl list-dependencies [target]' network 0:關 1:關 2:開 3:開 4:開 5:開 6:關
特別關注:systemctl方式實際效果
該方式實際是在 /etc/systemd/system/xxx/ 或 /etc/systemd/user/下創建 .service文件 的軟連接,分別代表系統服務與用戶服務。
其中,xxx為該服務的適用模式,如網絡服務network-online.target.wants、多用戶服務multi-user.target.wants。
[root@localhost ~]# systemctl enable mysqld Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
該方式下,取消卡機啟動,可以執行以下操作之一
systemctl disable xxx
移除 /etc/systemd/system/xxx/ 或 /etc/systemd/user/ 下相應軟連接或服務文件
二.通用方案
不管組件是否已經安裝為系統服務,可以通過開機啟動腳本實現
注意,以下操作,均需要設置相關腳本的可執行權限,即 chmod +x 啟動腳本
方法一:追加啟動命令到默認啟動腳本 /etc/rc.local,或/etc/rc.d/rc.local,前者是后者的軟連接
方法二:編寫啟動腳本.sh,放到目錄 /etc/profile.d下
方法三:編寫啟動腳本.sh,將腳本的執行指令追加到 /etc/rc.local,或/etc/rc.d/rc.local
三.crontab方案
crontab支持特殊關鍵字實現特定任務調度,代替 5個時間設置標識符(分 時 日 月 周),特殊語法以 @ 符號作為前綴
具體請參考:官方文檔
語法:@xxx command
@reboot : Run once after reboot. 重啟時執行一次,實測比 /etc/rc.d/rc.local 更早執行(提前1-2s),比默認1分鐘定時提前30s左右 @yearly : Run once a year, ie. "0 0 1 1 *". 一年執行一次,1月1號0點0分執行 @annually : Run once a year, ie. "0 0 1 1 *". 一年執行一次,1月1號0點0分執行 @monthly : Run once a month, ie. "0 0 1 * *". 一月執行一次,每月1號0點0分執行 @weekly : Run once a week, ie. "0 0 * * 0". 一周執行一次 @daily : Run once a day, ie. "0 0 * * *". 一天執行一次 @hourly : Run once an hour, ie. "0 * * * *". 一小時執行一次
即,可以使用 @reboot 關鍵字實現開機啟動功能,示例如下
[root@localhost daemonProcess]# crontab -e # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * command to be executed #開機啟動 @reboot /usr/local/daemonProcess/somescript.sh #守護 * * * * * /usr/local/daemonProcess/somescript.sh
特別關注:
是否同時使用 @reboot 和 定時,需要根據實際業務需要來決定。
如果守護定時設置為1分鐘,即 * * * * *,則建議不再設置 @reboot,因為兩者在開機啟動后的1分鐘內,都會執行,可能會造成重復執行,如果所守護的應用服務兼容重復啟動,沒有問題,如果不兼容,建議使用一種方案。
如果守護定時間隔比較大,還是建議同時使用 @reboot,保證應用服務及時啟動。
四.生產環境開機啟動方案建議
以上3種方案,建議在生產環境只采用一種,所有組件、服務統一,便于服務較多時快速運維。
比如,有些服務默認安裝時不會自動生成 系統服務,所以方案一的方式不能適用生產環境中所有組件、服務,如果此時按照各組件、服務分別制定開機啟動方案,則在后續如果服務啟動異常 或 服務發版時,就需要明確識別各服務的開機啟動方案,然后做相應的操作,提高運維成本,增加出錯概率。
附錄:開機啟動腳本示例
1.追加啟動命令到 /etc/rc.local,或/etc/rc.d/rc.local,前者是后者的軟連接 2.編寫啟動腳本.sh,放到目錄 /etc/profile.d下 --- 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 #redis /usr/local/redis/redis-5.0.13/bin/redis-server /usr/local/redis/redis-5.0.13/conf/redis.conf #zk #zk pid文件必須先刪除后重啟 rm -f /data/zookeeper/data/zookeeper_server.pid; /usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start #kafka JMX_PORT=9999 /usr/local/kafka_2.13-2.7.1/bin/kafka-server-start.sh -daemon /usr/local/kafka_2.13-2.7.1/config/server.properties #kafka-manager #kafka-manager pid文件必須先刪除后重啟 rm -f /usr/local/kafka-manager-2.0.0.2/RUNNING_PID nohup /usr/local/kafka-manager-2.0.0.2/bin/kafka-manager -Dconfig.file=/usr/local/kafka-manager-2.0.0.2/conf/application.conf -Dhttp.port=9002 >/dev/null 2>&1 & #mysql service mysqld start
審核編輯:黃飛
評論