1. 程式人生 > >CentOS7.5下開發systemctl管理的自定義Rsync啟動服務程序

CentOS7.5下開發systemctl管理的自定義Rsync啟動服務程序

mil family openssh sync start created emctl 級別 keygen

CentOS7.5下開發systemctl管理的自定義Rsync啟動服務程序

1.1 systemctl知識簡介

CentOS7 Linux開始,系統裏的網絡服務啟動已經從傳統的service改成了systemctl一個systemd工具,主要負責控制systemd系統和服務管理器。),管理開機自啟動的命令也從chkconfig改為了systemctl,由systemctl一個命令代替了CentOS7以前系統中的servicechkconfig兩個命令。

系統服務的腳本也從傳統的路徑的/etc/init.d(/etc/rc.d/init.d/),改到了/usr/lib/systemd(除此之外還有/etc/systemd/system),需要自啟動運行的程序,一般存在這個系統服務目錄下,即:

/usr/lib/systemd/system目錄,每一個服務以服務名.service”結尾,該文件的內容一般分為3部分:即[Unit][Service][Install]

1.2 systemctl管理的sshd服務配置介紹

下面是系統中sshd服務配置及解釋說明。

[root@oldboy ~]# cat /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 #<==服務類型,可選有forking、notify、simple等。
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   #<==這裏為設置多用戶級別。可為空格分隔的列表, 表示在使用 systemctl enable 啟用此單元時, 將會在對應的目錄設置對應文件的軟連接。
更多說明,可參考systemd.unit、system.service文檔,此不細述,都掌握了意義也不大,可以寫出啟動腳本即可。

1.3 systemctl管理的rsyncd_oldboy服務配置說明

下面是我們人為配置的rsyncd服務配置及詳細解釋說明,因為系統裏已經配置好了rsyncd.service,因此這裏使用rsyncd_oldboy.service以區別。

[root@oldboy ~]# cat /usr/lib/systemd/system/rsyncd_oldboy.service
[Unit]
Description=Rsync service
After=network.target
 
[Service]
Type=forking  #<==後臺運行。
PIDFile=/var/run/rsyncd.pid                #<==PID路徑。
ExecStart=/etc/rc.d/init.d/rsyncd start    #<==兼容CentOS6的啟動服務腳本,介紹在下文。
ExecReload=/etc/rc.d/init.d/rsyncd restart #<==兼容CentOS6的重啟服務腳本,介紹在下文。
ExecStop=/etc/rc.d/init.d/rsyncd stop      #<==兼容CentOS6的停止服務腳本,介紹在下文。
PrivateTmp=true    #<==開啟獨立的空間。
 
[Install]
WantedBy=multi-user.target  #<==這裏為設置多用戶級別。
特別說明:本文僅僅使用rsync服務為例進行示例,對於系統沒有的服務可以這樣完成利用systemctl管理,但其實rsync服務系統已經早就配置好了,很簡單簡潔。
[root@oldboy ~]# cat /usr/lib/systemd/system/rsyncd.service
[Unit]
Description=fast remote file copy program daemon
ConditionPathExists=/etc/rsyncd.conf
 
[Service]
EnvironmentFile=/etc/sysconfig/rsyncd
ExecStart=/usr/bin/rsync --daemon --no-detach "$OPTIONS"
 
[Install]
WantedBy=multi-user.target

1.4 Centos6下的rsync專業啟動腳本

下面是Centos6下的rsync專業啟動腳本,在/usr/lib/systemd/system/rsyncd_oldboy.service裏面會使用這個腳本。

[root@oldboy ~]# cat /etc/rc.d/init.d/rsyncd
#!/bin/bash
# chkconfig: 2345 21 81
# description: rsync service start and stop scripts
# Author: oldboy
# Organization: www.oldboyedu.com
[ -f /etc/rc.d/init.d/functions ] && source /etc/rc.d/init.d/functions
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/rsync"
rsyncd_pid_file_path="/var/run/rsyncd.pid"
#成功提示函數
log_success_msg(){
    #action為特殊的提示函數,$@為所有參數。
    action "SUCCESS! $@" /bin/true
}
#失敗提示函數
log_failure_msg(){
    action  "ERROR! $@" /bin/false
}
start(){
    rsync --daemon &>/dev/null
    retval=$?
    if [ $retval -eq 0 ]
    then
        log_success_msg "Rsyncd is started."
        if test -w "$lockdir" #判斷鎖目錄是否可寫。
        then
            touch "$lock_file_path" #創建鎖文件。
            return $retval
        else
            log_failure_msg "Rsync lockfile denied" #調用失敗函數提示。
            return 1
        fi
    else
        echo "Rsyncd startup fail."
        return 1
    fi
}
stop(){
    if test -s "$rsyncd_pid_file_path"
    then
        #讀取pidfile
        rsyncd_pid=`cat "$rsyncd_pid_file_path"`
      
        if (kill -0 $rsyncd_pid 2>/dev/null)
        then
            kill $rsyncd_pid
            retval=$?
            if [ $retval -eq 0 ]
            then
                log_success_msg "Rsync Stop" #調用停止成功函數。
                if test -f "$lock_file_path"
                then
                    rm "$lock_file_path"  #刪除鎖文件。
                fi
                return $retval
            else
                log_failure_msg "Rsyncd Stop."
                return $retval
            fi
        else
            log_failure_msg "rsync server_pid's process is not running!"
            rm "$rsyncd_pid_file_path"
        fi
    else
        log_failure_msg "Rsync server PID file is null or not exist!"
        return 1
    fi
}
case "$1" in
    start)
        start
        retval=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    restart)
        stop
        sleep 2
        start
        retval=$?
        ;;
    *)
        echo $"Usage:$0 {start|stop|restart}"
        exit 1
esac
exit $retval

1.5 配置開機自啟動以及實現systemctl管理rsync服務

1、設置開機自啟動

[root@oldboy ~]# systemctl enable rsyncd_oldboy.service
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd_oldboy.service to /usr/lib/systemd/system/rsyncd_oldboy.service.

2、查看設置狀態

[root@oldboy ~]# systemctl status rsyncd_oldboy.service
rsyncd_oldboy.service - Rsync service
   Loaded: loaded (/usr/lib/systemd/system/rsyncd_oldboy.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
[root@oldboy ~]# systemctl is-enabled rsyncd_oldboy.service
enabled

3、使用systemctl啟動rsync並查看狀態

[root@oldboy ~]# systemctl start rsyncd_oldboy.service
[root@oldboy ~]# systemctl status rsyncd_oldboy.service
● rsyncd_oldboy.service - Rsync service
   Loaded: loaded (/usr/lib/systemd/system/rsyncd_oldboy.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2018-08-07 18:56:06 CST; 23s ago
  Process: 1586 ExecStart=/etc/rc.d/init.d/rsyncd start (code=exited, status=0/SUCCESS)
 Main PID: 1590 (rsync)
   CGroup: /system.slice/rsyncd_oldboy.service
           └─1590 rsync --daemon
8月 07 18:56:06 oldboy systemd[1]: Starting Rsync service...
8月 07 18:56:06 oldboy rsyncd[1590]: rsyncd version 3.1.2 starting, listening on port 873
8月 07 18:56:06 oldboy rsyncd[1586]: SUCCESS! Rsyncd is started. [  確定  ]
8月 07 18:56:06 oldboy systemd[1]: Started Rsync service.

4、使用lsof檢查真實服務狀態

[root@oldboy ~]# lsof -i :873 #<==需要yum install lsof -y。
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   1590 root    4u  IPv4  25765      0t0  TCP *:rsync (LISTEN)
rsync   1590 root    5u  IPv6  25766      0t0  TCP *:rsync (LISTEN)

5、使用systemctl停止rsync並查看狀態

[root@oldboy ~]# systemctl stop rsyncd_oldboy.service
[root@oldboy ~]# lsof -i :873

6、使用systemctl取消rsync開機自啟動並查看狀態

[root@oldboy ~]# systemctl disable rsyncd_oldboy
Removed symlink /etc/systemd/system/multi-user.target.wants/rsyncd_oldboy.service.
[root@oldboy ~]# systemctl is-enabled rsyncd
disabled

通過以上的實踐,我們看到已經可以使用systemctl替代了傳統的servicechkconfig,如果你看懂了,就趕緊實踐吧。


CentOS7.5下開發systemctl管理的自定義Rsync啟動服務程序