CentOS7開機自啟服務、腳本


說明:CentOS7中,不建議再使用rc.local了,因此需要其它方法設置開機自啟服務或腳本。

1. 添加開機自啟服務

CentOS7中添加開機自啟服務非常方便,只需要兩條命令,這里以Jenkins為例:

systemctl enable jenkins.service    #設置jenkins服務為自啟動服務

sysstemctl start jenkins.service    #啟動jenkins服務

systemctl其它命令:

systemctl daemon-reload       #重載系統服務

systemctl enable *.service    #設置某服務開機啟動

systemctl start *.service     #啟動某服務

systemctl stop *.service      #停止某服務

systemctl reload *.service    #重啟某服務

2. 添加開機自啟腳本

1、以腳本autostart.sh為例,先編寫autostart.sh腳本

2、將腳本移動到/etc/rc.d/init.d目錄下

mv autostart.sh /etc/rc.d/init.d

3、賦予腳本執行權限

chmod +x /etc/rc.d/init.d/autostart.sh

4、加入開機啟動

cd /etc/rc.d/init.d

chkconfig --add autostart.sh

chkconfig autostart.sh on

5、查看是否添加成功

chkconfig --list

6、重啟驗證

7、可能的問題

1) bash: service: command not found

執行yum install initscripts -y安裝service指令

2) service XXX does not support chkconfig

必須把下面兩行注釋放在/etc/init.d/autostart.sh文件中

vim /etc/init.d/autostart.sh

添加下面兩句到#!/bin/bash之后:

#chkconfig: 2345 10 90

#description: autostart

其中2345是默認啟動級別,級別有0-67個級別。

²  等級0表示:表示關機

²  等級1表示:單用戶模式

²  等級2表示:無網絡連接的多用戶命令行模式

²  等級3表示:有網絡連接的多用戶命令行模式

²  等級4表示:不可用

²  等級5表示:帶圖形界面的多用戶模式

²  等級6表示:重新啟動

10是啟動優先級,90是停止優先級,優先級范圍是0~100,數字越大,優先級越低。

上面的注釋的意思是,zookeeper服務必須在運行級2345下被啟動或關閉,啟動的優先級是10,關閉的優先級是90

3. 自定義systemctl服務腳本

Centos7開機第一程序從init完全換成了systemd的啟動方式,而systemd依靠unit的方式來控制開機服務,開機級別等功能。

Centos7的服務systemctl 腳本一般存放在:/usr/lib/systemd,目錄下又有usersystem之分:

²  /usr/lib/systemd/system    #系統服務,開機不需要登錄就能運行的程序(相當於開機自啟)

²  /usr/lib/systemd/user      #用戶服務,需要登錄后才能運行的程序

目錄下又存在兩種類型的文件:

²  *.service    #服務級別unit

²  *.target     #開機級別unit

CentOS7的每一個服務以.service結尾,一般會分為3部分:[Unit][Service][Install],這里以xxx.service為例:vim /usr/lib/systemd/system/xxx.service

vim /usr/lib/systemd/system/xxx.service

[Unit]    #主要是服務說明

Description=test    #簡單描述服務

After=network.target    #描述服務類別,表示本服務需要在network服務啟動后在啟動

Before=xxx.service    #表示需要在某些服務啟動之前啟動,AfterBefore字段只涉及啟動順序,不涉及依賴關系。

 

[Service]    #核心區域

Type=forking    #表示后台運行模式。

User=user    #設置服務運行的用戶

Group=user    #設置服務運行的用戶組

KillMode=control-group    #定義systemd如何停止服務

PIDFile=/usr/local/test/test.pid    #存放PID的絕對路徑

Restart=no    #定義服務進程退出后,systemd的重啟方式,默認是不重啟

ExecStart=/usr/local/test/bin/startup.sh    #服務啟動命令,命令需要絕對路徑

PrivateTmp=true    #表示給服務分配獨立的臨時空間

 

[Install]

WantedBy=multi-user.target    #多用戶

字段說明:

Type的類型:

    simple(默認):   #ExecStart字段啟動的進程為主進程

    forking:       #ExecStart字段以fork()方式啟動,此時父進程將退出,子進程將成為主進程(后台                       運行)。一般都設置為forking

    oneshot:        #類似於simple,但只執行一次,systemd會等它執行完,才啟動其他服務

    dbus:           #類似於simple, 但會等待D-Bus信號后啟動

    notify:         #類似於simple, 啟動結束后會發出通知信號,然后systemd再啟動其他服務

    idle:           #類似於simple,但是要等到其他任務都執行完,才會啟動該服務。

 

EnvironmentFile:

    指定配置文件,和連詞號組合使用,可以避免配置文件不存在的異常。

 

Environment:

    后面接多個不同的shell變量。

    例如:

    Environment=DATA_DIR=/data/elk

    Environment=LOG_DIR=/var/log/elasticsearch

    Environment=PID_DIR=/var/run/elasticsearch

    EnvironmentFile=-/etc/sysconfig/elasticsearch

 

連詞號(-):

    在所有啟動設置之前,添加的變量字段,都可以加上連詞號,表示抑制錯誤,即發生錯誤時,不影響其他命    令的執行。

    比如EnviromentFile=-/etc/sysconfig/xxx表示即使文件不存在,也不會拋異常

 

KillMode的類型:

    control-group(默認):   #當前控制組里的所有子進程,都會被殺掉

    process:                #只殺主進程

    mixed:                  #主進程將收到SIGTERM信號,子進程收到SIGKILL信號

    none:                   #沒有進程會被殺掉,只是執行服務的stop命令

 

Restart的類型:

    no(默認值):    #退出后無操作

    on-success:    #只有正常退出時(退出狀態碼為0),才會重啟

    on-failure:    # 非正常退出時,重啟,包括被信號終止和超時等

    on-abnormal:   # 只有被信號終止或超時,才會重啟

    on-abort:      # 只有在收到沒有捕捉到的信號終止時,才會重啟

    on-watchdog:   # 超時退出時,才會重啟

    always:         # 不管什么退出原因,都會重啟

                    #對於守護進程,推薦用on-failure

 

RestartSec字段:

    表示systemd重啟服務之前,需要等待的秒數:RestartSec:30

 

Exec*字段:

    #Exec*后面接的命令,僅接受“指令參數參數..”格式,不能接受 <> | & 等特殊字符,很多bash語法也不支持。如果想支持bash語法,需要設置Tyep=oneshot

    ExecStart:      #啟動服務時執行的命令

    ExecReload:     #重啟服務時執行的命令

    ExecStop:       #停止服務時執行的命令

    ExecStartPre:   #啟動服務前執行的命令

    ExecStartPost:  #啟動服務后執行的命令

    ExecStopPost:   #停止服務后執行的命令

 

WantedBy字段:

    multi-user.target:    #表示多用戶命令行狀態,這個設置很重要

    graphical.target:     #表示圖形用戶狀體,它依賴於multi-user.target


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM