主頁(yè) > 知識(shí)庫(kù) > 在Linux系統(tǒng)中創(chuàng)建和修改systemd單元文件

在Linux系統(tǒng)中創(chuàng)建和修改systemd單元文件

熱門標(biāo)簽:地圖上標(biāo)注點(diǎn)位的圖標(biāo) 中山防封卡電銷卡辦理 電銷語(yǔ)音機(jī)器人哪個(gè)好 江蘇小型外呼系統(tǒng)軟件 百度地圖標(biāo)注未成功 常熟外呼系統(tǒng) 拉薩銷售外呼系統(tǒng)軟件 電話機(jī)器人服務(wù)器部署 文山外呼營(yíng)銷系統(tǒng)

(1)單元文件概述


單元文件包含單元的指令和行為信息。在后臺(tái)systemctl命令和單元文件一起工作。為了出色而正確的完成工作,系統(tǒng)管理員必須能夠手工編輯單元文件。一般系統(tǒng)管理員手工創(chuàng)建的單元文件建議存放在/etc/systemd/system/目錄下面。
單元配置文件的格式是:

復(fù)制代碼
代碼如下:

unit_name.type_extension
 

這里的unit_name代表單元名稱,type_extension代表單元類型。
單元文件可以作為附加的文件放置到一個(gè)目錄下面,比如為了定制sshd.service服務(wù),可以創(chuàng)建sshd.service.d/custom.conf文件,在文件中做一些自定義的配置。
同樣的,可以創(chuàng)建sshd.service.wants/和sshd.service.requires/目錄。這些目錄包含sshd服務(wù)關(guān)聯(lián)服務(wù)的軟連接,在系統(tǒng)安裝的時(shí)候,這些軟連接或自動(dòng)創(chuàng)建,也可以手工創(chuàng)建軟連接。
許多單元配置文件可以使用單元說(shuō)明符--通配的字符串,可以在單元文件被引導(dǎo)的時(shí)候動(dòng)態(tài)的被變量替換。這使創(chuàng)建一些通用的單元配置模版成為可能。


(2)理解單元文件結(jié)構(gòu)


典型的單元文件包含三節(jié):
[Unit]節(jié),包含不依賴單元類型的一般選項(xiàng),這些選型提供單元描述,知道單元行為,配置單元和其他單元的依賴性。
[unittype]節(jié),如果單元有特定的類型指令,在unittype節(jié)這些指令被組織在一起。舉個(gè)例子,服務(wù)單元文件包含[Service]節(jié),里面有經(jīng)常使用的服務(wù)配置。
[Install]節(jié),包含systemctlenable或者disable的命令安裝信息。
1)[Unit]節(jié)選項(xiàng)
Description單元描述信息,這些文字信息在systemclstatus命令是會(huì)輸出。
Documentation單元文檔信息的URLs。
After定義在那些單元之后啟動(dòng),本單元只在制定的單元啟動(dòng)之后啟動(dòng),不像Requires選項(xiàng),After選項(xiàng)不明確激活特定的單元,Before選項(xiàng)則是有相反的功能。
Requires配置單元的依賴性,在Requires選項(xiàng)中的單元需要一起被激活,如果有一個(gè)單元啟動(dòng)失敗,其他單元都不會(huì)被啟動(dòng)。
Wants比Requires選項(xiàng)依賴性要弱很多,如果列表之中的的單元啟動(dòng)失敗,不會(huì)對(duì)其他單元造成影響,這是推薦的建立自定義單元依賴性的方式。
Conflicts定義單元沖突關(guān)系,和Requires相反。
2)[unittype]類型是[Service]時(shí)的選項(xiàng)
Type配置單元進(jìn)程在啟動(dòng)時(shí)候的類型,影響執(zhí)行和關(guān)聯(lián)選項(xiàng)的功能,可選的關(guān)鍵字是:
simple默認(rèn)值,進(jìn)程和服務(wù)的主進(jìn)程一起啟動(dòng);
forking進(jìn)程作為服務(wù)主進(jìn)程的一個(gè)子進(jìn)程啟動(dòng),父進(jìn)程在完全啟動(dòng)之后退出。
oneshot同simple相似,但是進(jìn)程在啟動(dòng)單元之后隨之退出。
dbus同simple相似,但是隨著單元啟動(dòng)后只有主進(jìn)程得到D-BUS名字。
notify同simple相似,但是隨著單元啟動(dòng)之后,一個(gè)主要信息被sd_notify()函數(shù)送出。
idle同simple相似,實(shí)際執(zhí)行進(jìn)程的二進(jìn)制程序會(huì)被延緩直到所有的單元的任務(wù)完成,主要是避免服務(wù)狀態(tài)和shell混合輸出。
ExecStart指定啟動(dòng)單元的命令或者腳本,ExecStartPre和ExecStartPost節(jié)指定在ExecStart之前或者之后用戶自定義執(zhí)行的腳本。Type=oneshot允許指定多個(gè)希望順序執(zhí)行的用戶自定義命令。
ExecStop指定單元停止時(shí)執(zhí)行的命令或者腳本。
ExecReload指定單元重新加載是執(zhí)行的命令或者腳本。
Restart這個(gè)選項(xiàng)如果被允許,服務(wù)重啟的時(shí)候進(jìn)程會(huì)退出,會(huì)通過(guò)systemctl命令執(zhí)行清除并重啟的操作。
RemainAfterExit如果設(shè)置這個(gè)選擇為真,服務(wù)會(huì)被認(rèn)為是在激活狀態(tài),即使所以的進(jìn)程已經(jīng)退出,默認(rèn)的值為假,這個(gè)選項(xiàng)只有在Type=oneshot時(shí)需要被配置。
3)[Install]節(jié)選項(xiàng)
Alias為單元提供一個(gè)空間分離的附加名字。
RequiredBy單元被允許運(yùn)行需要的一系列依賴單元,RequiredBy列表從Require獲得依賴信息。
WantBy單元被允許運(yùn)行需要的弱依賴性單元,Wantby從Want列表獲得依賴信息。
Also指出和單元一起安裝或者被協(xié)助的單元。
DefaultInstance實(shí)例單元的限制,這個(gè)選項(xiàng)指定如果單元被允許運(yùn)行默認(rèn)的實(shí)例。
4)一個(gè)postfix服務(wù)的例子:
單元文件位于/usr/lib/systemd/system/postifix.service,內(nèi)容如下:

復(fù)制代碼
代碼如下:

[Unit]
Description=PostfixMailTransportAgent
After=syslog.targetnetwork.target
Conflicts=sendmail.serviceexim.service
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfixstart
ExecReload=/usr/sbin/postfixreload
ExecStop=/usr/sbin/postfixstop
[Install]
WantedBy=multi-user.target
 

(3)創(chuàng)建自定義的單元文件


以下幾種場(chǎng)景需要自定義單元文件:
希望自己創(chuàng)建守護(hù)進(jìn)程;
為現(xiàn)有的服務(wù)創(chuàng)建第二個(gè)實(shí)例;
引入SysV init腳本。
另外一方面,有時(shí)候需要修改已有的單元文件。
下面介紹創(chuàng)建單元文件的步驟:
1)準(zhǔn)備自定義服務(wù)的執(zhí)行文件。
可執(zhí)行文件可以是腳本,也可以是軟件提供者的的程序,如果需要,為自定義服務(wù)的主進(jìn)程準(zhǔn)備一個(gè)PID文件,一保證PID保持不變。另外還可能需要的配置環(huán)境變量的腳本,確保所以腳本都有可執(zhí)行屬性并且不需要交互。
2)在/etc/systemd/system/目錄創(chuàng)建單元文件,并且保證只能被root用戶編輯:

復(fù)制代碼
代碼如下:

touch/etc/systemd/system/name.servicechmod664/etc/systemd/system/name.service
 

文件不需要執(zhí)行權(quán)限。
3)打開name.service文件,添加服務(wù)配置,各種變量如何配置視所添加的服務(wù)類型而定,下面是一個(gè)依賴網(wǎng)絡(luò)服務(wù)的配置例子:

復(fù)制代碼
代碼如下:

[Unit]
Description=service_description
After=network.target
[Service]
ExecStart=path_to_executable
Type=forking
PIDFile=path_to_pidfile
[Install]
WantedBy=default.target
 

4)通知systemd有個(gè)新服務(wù)添加:

復(fù)制代碼
代碼如下:

systemctldaemon-reload
systemctlstartname.service
 

(4)創(chuàng)建emacs.service例子:


1)創(chuàng)建文件,并確保正確權(quán)限:
 

復(fù)制代碼
代碼如下:

~]#touch/etc/systemd/system/emacs.service
~]#chmod664/etc/systemd/system/emacs.service
 

2)添加配置信息:
 

復(fù)制代碼
代碼如下:

[Unit]
Description=Emacs:theextensible,self-documentingtexteditor
[Service]
Type=forking
ExecStart=/usr/bin/emacs--daemon
ExecStop=/usr/bin/emacsclient--eval"(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=always
[Install]
WantedBy=default.target
 

3)通知systemd并開啟服務(wù):
 

復(fù)制代碼
代碼如下:

~]#systemctldaemon-reload
~]#systemctlstartemacs.service
 

(5)創(chuàng)建第二個(gè)sshd服務(wù)的例子


1)拷貝sshd_config文件
 

復(fù)制代碼
代碼如下:
]#cp/etc/ssh/sshd{,-second}_config
 

2)編輯sshd-second_config文件,添加22220的端口,和PID文件:
 

復(fù)制代碼
代碼如下:
Port22220
PidFile/var/run/sshd-second.pid
 

如果還需要修改其他參數(shù),請(qǐng)閱讀幫助。
3)拷貝單元文件:
 

復(fù)制代碼
代碼如下:
~]#cp/usr/lib/systemd/system/sshd{,-second}.service
 

4)編輯單元文件sshd-second.service
修改描述字段

復(fù)制代碼
代碼如下:
Description=OpenSSHserversecondinstancedaemon
 
添加sshd.service服務(wù)在After關(guān)鍵字之后:

復(fù)制代碼
代碼如下:
After=syslog.targetnetwork.targetauditd.servicesshd.service
 
移除sshdkey創(chuàng)建:

復(fù)制代碼
代碼如下:
ExecStartPre=/usr/sbin/sshd-keygen
 

移除這一行
在執(zhí)行腳本里,添加第二sshd服務(wù)的配置文件:

復(fù)制代碼
代碼如下:
ExecStart=/usr/sbin/sshd-D-f/etc/ssh/sshd-second_config$OPTIONS
 
修改后的sshd-second.service文件內(nèi)容如下:
 
復(fù)制代碼
代碼如下:

[Unit]
Description=OpenSSHserversecondinstancedaemon
After=syslog.target network.targe tauditd.service sshd.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config$OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
 

5)如果使用SELinux,添加tcp端口,負(fù)責(zé)第二sshd服務(wù)的端口就會(huì)被拒絕綁定:
 

復(fù)制代碼
代碼如下:
~]#semanage port -a -tssh_port_t -p tcp22220
 

6)設(shè)置開機(jī)啟動(dòng)并測(cè)試:

復(fù)制代碼
代碼如下:

~]#systemctl enable sshd-second.service
~]$ssh -p 22220 user@server
 

確保防火墻端口也開放。


(6)修改已經(jīng)存在的單元文件


systemd單元配置文件默認(rèn)保存在/usr/lib/systemd/system/目錄,系統(tǒng)管理員不建議直接修改這個(gè)目錄下的文件,自定義的文件在/etc/systemd/system/目錄下,如果有擴(kuò)展的需求,可以使用以下方案:
創(chuàng)建一個(gè)目錄/etc/systemd/system/unit.d/,這個(gè)是最推薦的一種方式,可以參考初始的單元文件,通過(guò)附件配置文件來(lái)擴(kuò)展默認(rèn)的配置,對(duì)默認(rèn)單元文件的升級(jí)會(huì)被自動(dòng)升級(jí)和應(yīng)用。
從/usr/lib/systemd/system/拷貝一份原始配置文件到/etc/systemd/system/,然后修改。復(fù)制的版本會(huì)覆蓋原始配置,這種方式不能增加附件的配置包,用于不需要附加功能的場(chǎng)景。
如果需要恢復(fù)到默認(rèn)的配置文件,只需要?jiǎng)h除/etc/systemd/system/下的配置文件就可以了,不需要重啟機(jī)器,使用如下命令應(yīng)用改變就可以:

復(fù)制代碼
代碼如下:

systemctl daemon-reload
 

daemon-reload選項(xiàng)重新加載所以單元文件并重新創(chuàng)建依賴書,在需要立即應(yīng)用單元文件改變的時(shí)候使用。另外,也可以使用下面的命令達(dá)到同樣的目的:
 

復(fù)制代碼
代碼如下:

init q
 

還有,如果修改的是一個(gè)正在運(yùn)行服務(wù)的單元文件,服務(wù)需要被重啟下:

復(fù)制代碼
代碼如下:
systemct lrestart name.service
 

(7)擴(kuò)展默認(rèn)單元配置文件配置


為了擴(kuò)展默認(rèn)的單元文件配置,需要先在/etc/systemd/system/下創(chuàng)建一個(gè)目錄,用root執(zhí)行類似下面的命令:
 

復(fù)制代碼
代碼如下:

mkdir/etc/systemd/system/name.service.d
 

在剛才創(chuàng)建的目錄之下創(chuàng)建配置文件,必須以.conf文件結(jié)尾。
例如創(chuàng)建一個(gè)自定義的依賴文件,內(nèi)容如下:
 

復(fù)制代碼
代碼如下:

[Unit]
Requires=new_dependency
After=new_dependency
 

另外一個(gè)例子,可以配置重啟的時(shí)候,在主進(jìn)程退出后30秒在重啟,配置例子如下:

復(fù)制代碼
代碼如下:

[Service]
Restart=always
RestartSec=30
 

推薦每次只產(chǎn)生一個(gè)小文件,每個(gè)文件只聚焦完善一個(gè)功能,這樣配置文件很容易被移除或者鏈接到其他服務(wù)對(duì)的配置目錄中。
為了應(yīng)用剛才的修改,使用root執(zhí)行以下操作:
 

復(fù)制代碼
代碼如下:

systemctldaemon-reload
systemctlrestartname.service
 

例子:擴(kuò)展httpd.service服務(wù)配置
為了是httpd服務(wù)啟動(dòng)的時(shí)候執(zhí)行用戶自定義的腳本,需要修改httpd的單元配置文件,執(zhí)行以下幾步操作,首先創(chuàng)建一個(gè)自定義文件的目錄及自定義文件:
 

復(fù)制代碼
代碼如下:

~]#mkdir/etc/systemd/system/httpd.service.d
~]#touch/etc/systemd/system/httpd.service.d/custom_script.conf
 

假設(shè)自定義文件位置在/usr/local/bin/custom.sh,將這個(gè)信息添加到custom_script.conf自定義腳本中:

復(fù)制代碼
代碼如下:

[Service]
ExecStartPost=/usr/local/bin/custom.sh
 

應(yīng)用更改:

復(fù)制代碼
代碼如下:

~]#systemctldaemon-reload
~]#systemctlrestarthttpd.service
 

標(biāo)簽:法律問(wèn)答 石家莊 淮安 開封 湖南 和田 和田 馬鞍山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在Linux系統(tǒng)中創(chuàng)建和修改systemd單元文件》,本文關(guān)鍵詞  在,Linux,系統(tǒng),中創(chuàng),建和,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在Linux系統(tǒng)中創(chuàng)建和修改systemd單元文件》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于在Linux系統(tǒng)中創(chuàng)建和修改systemd單元文件的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章