<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 17.3 systemctl 針對 service 類型的配置文件 以前,我們如果想要創建系統服務,就得要到 /etc/init.d/ 下面去創建相對應的 bash shell script 來處理。那么現在 systemd 的環境下面, 如果我們想要設置相關的服務啟動環境,那應該如何處理呢?這就是本小節的任務啰! ### 17.3.1 systemctl 配置文件相關目錄簡介 現在我們知道服務的管理是通過 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目錄內。但是 Red Hat 官方文件指出, 該目錄的文件主要是原本軟件所提供的設置,建議不要修改!而要修改的位置應該放置于 /etc/systemd/system/ 目錄內。舉例來說,如果你想要額外修改 vsftpd.service 的話, 他們建議要放置到哪些地方呢? * /usr/lib/systemd/system/vsftpd.service:官方釋出的默認配置文件; * /etc/systemd/system/vsftpd.service.d/custom.conf:在 /etc/systemd/system 下面創建與配置文件相同文件名的目錄,但是要加上 .d 的擴展名。然后在該目錄下創建配置文件即可。另外,配置文件最好附文件名取名為 .conf 較佳! 在這個目錄下的文件會“累加其他設置”進入 /usr/lib/systemd/system/vsftpd.service 內喔! * /etc/systemd/system/vsftpd.service.wants/*:此目錄內的文件為鏈接文件,設置相依服務的鏈接。意思是啟動了 vsftpd.service 之后,最好再加上這目錄下面建議的服務。 * /etc/systemd/system/vsftpd.service.requires/*:此目錄內的文件為鏈接文件,設置相依服務的鏈接。意思是在啟動 vsftpd.service 之前,需要事先啟動哪些服務的意思。 基本上,在配置文件里面你都可以自由設置相依服務的檢查,并且設置加入到哪些 target 里頭去。但是如果是已經存在的配置文件,或者是官方提供的配置文件, Red Hat 是建議你不要修改原設置,而是到上面提到的幾個目錄去進行額外的客制化設置比較好!當然,這見仁見智~如果你硬要修改原始的 /usr/lib/systemd/system 下面的配置文件,那也是 OK 沒問題的!并且也能夠減少許多配置文件的增加~鳥哥自己認為,這樣也不錯!反正,就完全是個人喜好啰~ ### 17.3.2 systemctl 配置文件的設置項目簡介 了解了配置文件的相關目錄與文件之后,再來,當然得要了解一下配置文件本身的內容了!讓我們先來瞧一瞧 sshd.service 的內容好了! 原本想拿 vsftpd.service 來講解,不過該文件的內容比較陽春,還是看一下設置項目多一些的 sshd.service 好了! ``` [root@study ~]# cat /usr/lib/systemd/system/sshd.service [Unit] # 這個項目與此 unit 的解釋、執行服務相依性有關 Description=OpenSSH server daemon After=network.target sshd-keygen.service Wants=sshd-keygen.service [Service] # 這個項目與實際執行的指令參數有關 EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] # 這個項目說明此 unit 要掛載哪個 target 下面 WantedBy=multi-user.target ``` 分析上面的配置文件,我們大概能夠將整個設置分為三個部份,就是: * [Unit]: unit 本身的說明,以及與其他相依 daemon 的設置,包括在什么服務之后才啟動此 unit 之類的設置值; * [Service], [Socket], [Timer], [Mount], [Path]..:不同的 unit type 就得要使用相對應的設置項目。我們拿的是 sshd.service 來當范本,所以這邊就使用 [Service] 來設置。 這個項目內主要在規范服務啟動的腳本、環境配置文件文件名、重新啟動的方式等等。 * [Install]:這個項目就是將此 unit 安裝到哪個 target 里面去的意思! 至于配置文件內有些設置規則還是得要說明一下: * 設置項目通常是可以重復的,例如我可以重復設置兩個 After 在配置文件中,不過,后面的設置會取代前面的喔!因此,如果你想要將設置值歸零, 可以使用類似“ After= ”的設置,亦即該項目的等號后面什么都沒有,就將該設置歸零了 (reset)。 * 如果設置參數需要有“是/否”的項目 (布林值, boolean),你可以使用 1, yes, true, on 代表啟動,用 0, no, false, off 代表關閉!隨你喜好選擇啰! * 空白行、開頭為 # 或 ; 的那一行,都代表注解! 每個部份里面還有很多的設置細項,我們使用一個簡單的表格來說明每個項目好了! | [Unit] 部份 | | --- | --- | | 設置參數 | 參數意義說明 | | Description | 就是當我們使用 systemctl list-units 時,會輸出給管理員看的簡易說明!當然,使用 systemctl status 輸出的此服務的說明,也是這個項目! | | Documentation | 這個項目在提供管理員能夠進行進一步的文件查詢的功能!提供的文件可以是如下的數據:`Documentation=http://www....` `Documentation=man:sshd(8)` `Documentation=file:/etc/ssh/sshd_config` | | After | 說明此 unit 是在哪個 daemon 啟動之后才啟動的意思!基本上僅是說明服務啟動的順序而已,并沒有強制要求里頭的服務一定要啟動后此 unit 才能啟動。 以 sshd.service 的內容為例,該文件提到 After 后面有 network.target 以及 sshd-keygen.service,但是若這兩個 unit 沒有啟動而強制啟動 sshd.service 的話, 那么 sshd.service 應該還是能夠啟動的!這與 Requires 的設置是有差異的喔! | | Before | 與 After 的意義相反,是在什么服務啟動前最好啟動這個服務的意思。不過這僅是規范服務啟動的順序,并非強制要求的意思。 | | Requires | 明確的定義此 unit 需要在哪個 daemon 啟動后才能夠啟動!就是設置相依服務啦!如果在此項設置的前導服務沒有啟動,那么此 unit 就不會被啟動! | | Wants | 與 Requires 剛好相反,規范的是這個 unit 之后最好還要啟動什么服務比較好的意思!不過,并沒有明確的規范就是了!主要的目的是希望創建讓使用者比較好操作的環境。 因此,這個 Wants 后面接的服務如果沒有啟動,其實不會影響到這個 unit 本身! | | Conflicts | 代表沖突的服務!亦即這個項目后面接的服務如果有啟動,那么我們這個 unit 本身就不能啟動!我們 unit 有啟動,則此項目后的服務就不能啟動! 反正就是沖突性的檢查啦! | 接下來了解一下在 [Service] 當中有哪些項目可以使用! | [Service] 部份 | | --- | --- | | 設置參數 | 參數意義說明 | | Type | 說明這個 daemon 啟動的方式,會影響到 ExecStart 喔!一般來說,有下面幾種類型 simple:默認值,這個 daemon 主要由 ExecStart 接的指令串來啟動,啟動后常駐于內存中。forking:由 ExecStart 啟動的程序通過 spawns 延伸出其他子程序來作為此 daemon 的主要服務。原生的父程序在啟動結束后就會終止運行。 傳統的 unit 服務大多屬于這種項目,例如 httpd 這個 WWW 服務,當 httpd 的程序因為運行過久因此即將終結了,則 systemd 會再重新生出另一個子程序持續運行后, 再將父程序刪除。據說這樣的性能比較好!!oneshot:與 simple 類似,不過這個程序在工作完畢后就結束了,不會常駐在內存中。dbus:與 simple 類似,但這個 daemon 必須要在取得一個 D-Bus 的名稱后,才會繼續運行!因此設置這個項目時,通常也要設置 BusName= 才行!idle:與 simple 類似,意思是,要執行這個 daemon 必須要所有的工作都順利執行完畢后才會執行。這類的 daemon 通常是開機到最后才執行即可的服務!比較重要的項目大概是 simple, forking 與 oneshot 了!畢竟很多服務需要子程序 (forking),而有更多的動作只需要在開機的時候執行一次(oneshot),例如文件系統的檢查與掛載啊等等的。 | | EnvironmentFile | 可以指定啟動腳本的環境配置文件!例如 sshd.service 的配置文件寫入到 /etc/sysconfig/sshd 當中!你也可以使用 Environment= 后面接多個不同的 Shell 變量來給予設置! | | ExecStart | 就是實際執行此 daemon 的指令或腳本程序。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 兩個設置項目來在實際啟動服務前,進行額外的指令行為。 但是你得要特別注意的是,指令串僅接受“指令 參數 參數...”的格式,不能接受 &lt;, &gt;, &gt;&gt;, &#124;, & 等特殊字符,很多的 bash 語法也不支持喔! 所以,要使用這些特殊的字符時,最好直接寫入到指令腳本里面去!不過,上述的語法也不是完全不能用,亦即,若要支持比較完整的 bash 語法,那你得要使用 Type=oneshot 才行喔! 其他的 Type 才不能支持這些字符。 | | ExecStop | 與 systemctl stop 的執行有關,關閉此服務時所進行的指令。 | | ExecReload | 與 systemctl reload 有關的指令行為 | | Restart | 當設置 Restart=1 時,則當此 daemon 服務終止后,會再次的啟動此服務。舉例來說,如果你在 tty2 使用文字界面登陸,操作完畢后登出,基本上,這個時候 tty2 就已經結束服務了。 但是你會看到屏幕又立刻產生一個新的 tty2 的登陸畫面等待你的登陸!那就是 Restart 的功能!除非使用 systemctl 強制將此服務關閉,否則這個服務會源源不絕的一直重復產生! | | RemainAfterExit | 當設置為 RemainAfterExit=1 時,則當這個 daemon 所屬的所有程序都終止之后,此服務會再嘗試啟動。這對于 Type=oneshot 的服務很有幫助! | | TimeoutSec | 若這個服務在啟動或者是關閉時,因為某些緣故導致無法順利“正常啟動或正常結束”的情況下,則我們要等多久才進入“強制結束”的狀態! | | KillMode | 可以是 process, control-group, none 的其中一種,如果是 process 則 daemon 終止時,只會終止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 時, 則由此 daemon 所產生的其他 control-group 的程序,也都會被關閉。如果是 none 的話,則沒有程序會被關閉喔! | | RestartSec | 與 Restart 有點相關性,如果這個服務被關閉,然后需要重新啟動時,大概要 sleep 多少時間再重新啟動的意思。默認是 100ms (毫秒)。 | 最后,再來看看那么 Install 內還有哪些項目可用? | [Install] 部份 | | --- | --- | | 設置參數 | 參數意義說明 | | WantedBy | 這個設置后面接的大部分是 *.target unit !意思是,這個 unit 本身是附掛在哪一個 target unit 下面的!一般來說,大多的服務性質的 unit 都是附掛在 multi-user.target 下面! | | Also | 當目前這個 unit 本身被 enable 時,Also 后面接的 unit 也請 enable 的意思!也就是具有相依性的服務可以寫在這里呢! | | Alias | 進行一個鏈接的別名的意思!當 systemctl enable 相關的服務時,則此服務會進行鏈接文件的創建!以 multi-user.target 為例,這個家伙是用來作為默認操作環境 default.target 的規劃, 因此當你設置用成 default.target 時,這個 /etc/systemd/system/default.target 就會鏈接到 /usr/lib/systemd/system/multi-user.target 啰! | 大致的項目就有這些,接下來讓我們根據上面這些數據來進行一些簡易的操作吧! ### 17.3.3 兩個 vsftpd 運行的實例 我們在上一章將 vsftpd 的 port 改成 555 號了。不過,因為某些原因,所以你可能需要使用到兩個端口,分別是正常的 21 以及特殊的 555 ! 這兩個 port 都啟用的情況下,你可能就得要使用到兩個配置文件以及兩個啟動腳本設置了!現在假設是這樣: * 默認的 port 21:使用 /etc/vsftpd/vsftpd.conf 配置文件,以及 /usr/lib/systemd/system/vsftpd.service 設置腳本; * 特殊的 port 555:使用 /etc/vsftpd/vsftpd2.conf 配置文件,以及 /etc/systemd/system/vsftpd2.service 設置腳本。 我們可以這樣作: ``` # 1\. 先創建好所需要的配置文件 [root@study ~]# cd /etc/vsftpd [root@study vsftpd]# cp vsftpd.conf vsftpd2.conf [root@study vsftpd]# vim vsftpd.conf #listen_port=555 [root@study vsftpd]# diff vsftpd.conf vsftpd2.conf 128c128 &lt; #listen_port=555 --- &gt; listen_port=555 # 注意這兩個配置文件的差別喔!只有這一行不同而已! # 2\. 開始處理啟動腳本設置 [root@study vsftpd]# cd /etc/systemd/system [root@study system]# cp /usr/lib/systemd/system/vsftpd.service vsftpd2.service [root@study system]# vim vsftpd2.service [Unit] Description=Vsftpd second ftp daemon After=network.target [Service] Type=forking ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf [Install] WantedBy=multi-user.target # 重點在改了 vsftpd2.conf 這個配置文件喔! # 3\. 重新載入 systemd 的腳本配置文件內容 [root@study system]# systemctl daemon-reload [root@study system]# systemctl list-unit-files --all &#124; grep vsftpd vsftpd.service enabled vsftpd2.service disabled vsftpd@.service disabled vsftpd.target disabled [root@study system]# systemctl status vsftpd2.service vsftpd2.service - Vsftpd second ftp daemon Loaded: loaded (/etc/systemd/system/vsftpd2.service; disabled) Active: inactive (dead) [root@study system]# systemctl restart vsftpd.service vsftpd2.service [root@study system]# systemctl enable vsftpd.service vsftpd2.service [root@study system]# systemctl status vsftpd.service vsftpd2.service vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled) Active: active (running) since Wed 2015-08-12 22:00:17 CST; 35s ago Main PID: 12670 (vsftpd) CGroup: /system.slice/vsftpd.service └─12670 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf Aug 12 22:00:17 study.centos.vbird systemd[1]: Started Vsftpd ftp daemon. vsftpd2.service - Vsftpd second ftp daemon Loaded: loaded (/etc/systemd/system/vsftpd2.service; enabled) Active: active (running) since Wed 2015-08-12 22:00:17 CST; 35s ago Main PID: 12672 (vsftpd) CGroup: /system.slice/vsftpd2.service └─12672 /usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf [root@study system]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1340/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2387/master tcp6 0 0 :::555 :::* LISTEN 12672/vsftpd tcp6 0 0 :::21 :::* LISTEN 12670/vsftpd tcp6 0 0 :::22 :::* LISTEN 1340/sshd tcp6 0 0 ::1:25 :::* LISTEN 2387/master ``` 很簡單的將你的 systemd 所管理的 vsftpd 做了另一個服務!未來如果有相同的需求,同樣的方法作一遍即可! ### 17.3.4 多重的重復設置方式:以 getty 為例 我們的 CentOS 7 開機完成后,不是說有 6 個終端機可以使用嗎?就是那個 tty1~tty6 的啊!那個東西是由 agetty 這個指令達成的。 OK!那么這個終端機的功能又是從哪個項目所提供的呢?其實,那個東東涉及很多層面,主要管理的是 getty.target 這個 target unit , 不過,實際產生 tty1~tty6 的則是由 getty@.service 所提供的!咦!那個 @ 是啥東西? 先來查閱一下 /usr/lib/systemd/system/getty@.service 的內容好了: ``` [root@study ~]# cat //usr/lib/systemd/system/getty@.service [Unit] Description=Getty on %I Documentation=man:agetty(8) man:systemd-getty-generator(8) Documentation=http://0pointer.de/blog/projects/serial-console.html After=systemd-user-sessions.service plymouth-quit-wait.service After=rc-local.service Before=getty.target ConditionPathExists=/dev/tty0 [Service] ExecStart=-/sbin/agetty --noclear %I $TERM Type=idle Restart=always RestartSec=0 UtmpIdentifier=%I TTYPath=/dev/%I TTYReset=yes TTYVHangup=yes TTYVTDisallocate=yes KillMode=process IgnoreSIGPIPE=no SendSIGHUP=yes [Install] WantedBy=getty.target ``` 比較重要的當然就是 ExecStart 項目啰!那么我們去 man agetty 時,發現到它的語法應該是“ agetty --noclear tty1 ”之類的字樣, 因此,我們如果要啟動六個 tty 的時候,基本上應該要有六個啟動配置文件。亦即是可能會用到 getty1.service, getty2.service...getty6.service 才對! 哇!這樣控管很麻煩啊~所以,才會出現這個 @ 的項目啦!咦!這個 @ 到底怎么回事呢?我們先來看看 getty@.service 的上游,亦即是 getty.target 這個東西的內容好了! ``` [root@study ~]# systemctl show getty.target # 那個 show 的指令可以將 getty.target 的默認設置值也取出來顯示! Names=getty.target Wants=getty@tty1.service WantedBy=multi-user.target Conflicts=shutdown.target Before=multi-user.target After=getty@tty1.service getty@tty2.service getty@tty3.service getty@tty4.service getty@tty6.service getty@tty5.service .....(后面省略)..... ``` 你會發現,咦!怎么會多出六個怪異的 service 呢?我們拿 getty@tty1.service 來說明一下好了!當我們執行完 getty.target 之后, 他會持續要求 getty@tty1.service 等六個服務繼續啟動。那我們的 systemd 就會這么作: * 先看 /usr/lib/systemd/system/, /etc/systemd/system/ 有沒有 getty@tty1.service 的設置,若有就執行,若沒有則執行下一步; * 找 getty@.service 的設置,若有則將 @ 后面的數據帶入成 %I 的變量,進入 getty@.service 執行! 這也就是說,其實 getty@tty1.service 實際上是不存在的!他主要是通過 getty@.service 來執行~也就是說, getty@.service 的目的是為了要簡化多個執行的啟動設置, 他的命名方式是這樣的: ``` 原始文件:執行服務名稱@.service 可執行文件案:執行服務名稱@范例名稱.service ``` 因此當有范例名稱帶入時,則會有一個新的服務名稱產生出來!你再回頭看看 getty@.service 的啟動腳本: ``` ExecStart=-/sbin/agetty --noclear %I $TERM ``` 上表中那個 %I 指的就是“范例名稱”!根據 getty.target 的信息輸出來看,getty@tty1.service 的 %I 就是 tty1 啰!因此執行腳本就會變成“ /sbin/agetty --noclear tty1 ”! 所以我們才有辦法以一個配置文件來啟動多個 tty1 給用戶登陸啰! * 將 tty 的數量由 6 個降低到 4 個 現在你應該要感到困擾的是,那么“ 6 個 tty 是誰規定的”為什么不是 5 個還是 7 個?這是因為 systemd 的登陸配置文件 /etc/systemd/logind.conf 里面規范的啦! 假如你想要讓 tty 數量降低到剩下 4 個的話,那么可以這樣實驗看看: ``` # 1\. 修改默認的 logind.conf 內容,將原本 6 個虛擬終端機改成 4 個 [root@study ~]# vim /etc/systemd/logind.conf [Login] NAutoVTs=4 ReserveVT=0 # 原本是 6 個而且還注解,請取消注解,然后改成 4 吧! # 2\. 關閉不小心啟動的 tty5, tty6 并重新啟動 getty.target 啰! [root@study ~]# systemctl stop getty@tty5.service [root@study ~]# systemctl stop getty@tty6.service [root@study ~]# systemctl restart systemd-logind.service ``` 現在你再到桌面環境下,按下 [ctrl]+[alt]+[F1]~[F6] 就會發現,只剩下四個可用的 tty 啰!后面的 tty5, tty6 已經被放棄了!不再被啟動喔! 好!那么我暫時需要啟動 tty8 時,又該如何處理呢?需要重新創建一個腳本嗎?不需要啦!可以這樣作! ``` [root@study ~]# systemctl start getty@tty8.service ``` 無須額外創建其他的啟動服務配置文件喔! * 暫時新增 vsftpd 到 2121 端口 不知道你有沒有發現,其實在 /usr/lib/systemd/system 下面還有個特別的 vsftpd@.service 喔!來看看他的內容: ``` [root@study ~]# cat /usr/lib/systemd/system/vsftpd@.service [Unit] Description=Vsftpd ftp daemon After=network.target PartOf=vsftpd.target [Service] Type=forking ExecStart=/usr/sbin/vsftpd /etc/vsftpd/%i.conf [Install] WantedBy=vsftpd.target ``` 根據前面 getty@.service 的說明,我們知道在啟動的腳本設置當中, %i 或 %I 就是代表 @ 后面接的范例文件名的意思! 那我能不能創建 vsftpd3.conf 文件,然后通過該文件來啟動新的服務呢?就來玩玩看! ``` # 1\. 根據 vsftpd@.service 的建議,于 /etc/vsftpd/ 下面先創建新的配置文件 [root@study ~]# cd /etc/vsftpd [root@study vsftpd]# cp vsftpd.conf vsftpd3.conf [root@study vsftpd]# vim vsftpd3.conf listen_port=2121 # 2\. 暫時啟動這個服務,不要永久啟動他! [root@study vsftpd]# systemctl start vsftpd@vsftpd3.service [root@study vsftpd]# systemctl status vsftpd@vsftpd3.service vsftpd@vsftpd3.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd@.service; disabled) Active: active (running) since Thu 2015-08-13 01:34:05 CST; 5s ago [root@study vsftpd]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::2121 :::* LISTEN 16404/vsftpd tcp6 0 0 :::555 :::* LISTEN 12672/vsftpd tcp6 0 0 :::21 :::* LISTEN 12670/vsftpd ``` 因為我們啟用了 vsftpd@vsftpd3.service ,代表要使用的配置文件在 /etc/vsftpd/vsftpd3.conf 的意思!所以可以直接通過 vsftpd@.service 而無須重新設置啟動腳本! 這樣是否比前幾個小節的方法還要簡便呢? ^_^。通過這個方式,你就可以使用到新的配置文件啰!只是你得要注意到 @ 這個東西就是了! ^_^ ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 聰明的讀者可能立刻發現一件事,為啥這次 FTP 增加了 2121 端口卻不用修改 SELinux 呢?這是因為默認啟動小于 1024 號碼以下的端口時, 需要使用到 root 的權限,因此小于 1024 以下端口的啟動較可怕。而這次范例中,我們使用 2121 端口,他對于系統的影響可能小一些 (其實一樣可怕!), 所以就忽略了 SELinux 的限制了! ### 17.3.5 自己的服務自己作 我們來仿真自己作一個服務吧!假設我要作一只可以備份自己系統的服務,這只腳本我放在 /backups 下面,內容有點像這樣: ``` [root@study ~]# vim /backups/backup.sh #!/bin/bash source="/etc /home /root /var/lib /var/spool/{cron,at,mail}" target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz" [ ! -d /backups ] && mkdir /backups tar -zcvf ${target} ${source} &&gt; /backups/backup.log [root@study ~]# chmod a+x /backups/backup.sh [root@study ~]# ll /backups/backup.sh -rwxr-xr-x. 1 root root 220 Aug 13 01:57 /backups/backup.sh # 記得要有可執行的權限才可以喔! ``` 接下來,我們要如何設計一只名為 backup.service 的啟動腳本設置呢?可以這樣做喔! ``` [root@study ~]# vim /etc/systemd/system/backup.service [Unit] Description=backup my server Requires=atd.service [Service] Type=simple ExecStart=/bin/bash -c " echo /backups/backup.sh &#124; at now" [Install] WantedBy=multi-user.target # 因為 ExecStart 里面有用到 at 這個指令,因此, atd.service 就是一定要的服務! [root@study ~]# systemctl daemon-reload [root@study ~]# systemctl start backup.service [root@study ~]# systemctl status backup.service backup.service - backup my server Loaded: loaded (/etc/systemd/system/backup.service; disabled) Active: inactive (dead) Aug 13 07:50:31 study.centos.vbird systemd[1]: Starting backup my server... Aug 13 07:50:31 study.centos.vbird bash[20490]: job 8 at Thu Aug 13 07:50:00 2015 Aug 13 07:50:31 study.centos.vbird systemd[1]: Started backup my server. # 為什么 Active 是 inactive 呢?這是因為我們的服務僅是一個簡單的 script 啊! # 因此執行完畢就完畢了,不會繼續存在內存中喔! ``` 完成上述的動作之后,以后你都可以直接使用 systemctl start backup.service 進行系統的備份了!而且會直接丟進 atd 的管理中, 你就無須自己手動用 at 去處理這項任務了~好像還不賴喔! ^_^ 這樣自己做一個服務好像也不難啊! ^_^!自己動手玩玩看吧!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看