## 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 (之后) 兩個設置項目來在實際啟動服務前,進行額外的指令行為。 但是你得要特別注意的是,指令串僅接受“指令 參數 參數...”的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 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
< #listen_port=555
---
> 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 | 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 而無須重新設置啟動腳本! 這樣是否比前幾個小節的方法還要簡便呢? ^_^。通過這個方式,你就可以使用到新的配置文件啰!只是你得要注意到 @ 這個東西就是了! ^_^

**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} &> /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 | 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 去處理這項任務了~好像還不賴喔! ^_^
這樣自己做一個服務好像也不難啊! ^_^!自己動手玩玩看吧!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀