【systemctl】讓程序以守護進程的方式在后臺運行
首先需要創(chuàng)建一個systemd?unit 配置文件,比如:verdaccio.service,一般放在 /lib/systemd/system/ 下
添加配置如下:
[Unit] Description=Verdaccio lightweight npm proxy registry [Service] Type=simple Restart=on-failure User=verdaccio ExecStart=/usr/bin/verdaccio --config /etc/verdaccio/config.yaml [Install] WantedBy=multi-user.target
開機自啟動:systemctl enable verdaccio.service
立即啟動:systemctl start verdaccio.service
重新啟動:systemctl restart verdaccio.service
運行狀態(tài):systemctl status verdaccio.service
前言:
????????你有想過服務器上那么多服務在運行,它們都會怎樣工作?服務是獨立的個體,每個只管自己的死活,如果某個服務自己偷偷死了,會造成很嚴重的后果,且一種服務一種管理方式,這堆起來會累死老師傅的。
????????所以,Linux的管理服務能力是個香饃饃,就一點都不奇怪了。文章來源地址: https://www.yii666.com/blog/347720.html
????????linux 服務器主要的能力之一就是配置并管理系統(tǒng)上運行的各種服務程序。早初這種管理服務程序的能力就是由啟動程序init系統(tǒng)負責的,隨著Linux系統(tǒng)的迭代,早先的init系統(tǒng)已經(jīng)由最初的sysvinit進化到了今天的systemd。
????????所以,systemd作為init系統(tǒng)的啟動程序,負責管理運行在系統(tǒng)上的眾多服務,而systemd管理的手段并不難,只需要學會如何編寫運行服務的配置文件,就可以輕松管理服務了。
一、.server服務配置文件信息詳解
這是一個prometheus的服務進程:
(比如:/usr/lib/systemd/system目錄下的nginx.service文件)
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
ExecStart=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=/opt/nginx/sbin/nginx -s reload
ExecStop=/opt/nginx/sbin/nginx -s stop
ExecQuit=/opt/nginx/sbin/nginx -s quit
Type=forking
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]?? ? 控制單元:主要給出服務描述、啟動順序和依賴關系
Description:? ? ? ?對該服務的描述;
Documentation:?????????服務的文檔
After:????????說明本unit是在哪個服務后啟動。僅是說明服務啟動的順序而已,并沒有強制要求。
Before :? ? ??與After的意義相反
Requires:????? ?本unit需要在哪個服務啟動后才能夠啟動!這里設置服務間的依賴性。如果在此項設置的前導服務沒有啟動成功,那么本 unit 就不會被啟動!
Wants:? ? ??與Requires 剛好相反,規(guī)范的是這個unit之后還會啟動什么服務,如果這Wants 后面接的服務如果沒有啟動成功,不會影響到這個unit本身!
Conflicts:?????????這個項目后面接的服務如果有啟動,那么本unit就不能啟動!(互斥性) 如果本unit啟動了,則指定的服務就不能啟動。
[Service]? ? ?服務:主要給出服務的啟動行為,如何啟動、重啟、停止
EnvironmentFile:????????服務的參數(shù)文件,形成$OPTIONS;
ExecStart:? ? ? ?就是實際執(zhí)行此服務的程序。接受 “命令 參數(shù) 參數(shù)…” 的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 bash語法也不支持。所以,要使用這些特殊的字符時,最好直接寫入到腳本里面去!
ExecStop:????????用來實現(xiàn)systemctl stop命令,關閉服務。
ExecReload:? ? ? 用來實現(xiàn)systemctl reload命令,重新加載服務的配置信息。
ExecStartPre:? ? ? 啟動服務之前執(zhí)行的命令;
ExecStartPost:? ? ? 啟動服務之后執(zhí)行的命令;
ExecStopPre:? ? ? 停止服務之前執(zhí)行的命令;
ExecStopPost:? ? ? ?停止服務之后執(zhí)行的命令;
Type:????????服務啟動類型。默認simple表示ExecStart為主進程,notify類似于simple,啟動結束后會發(fā)出通知信號。
Type擴展:
?Type:定義啟動類型。它可以設置的值如下:
- simple:默認值,這個服務主要由ExecStart設置的程序來啟動,啟動后常駐于內存中
- forking:由ExecStart指定的啟動的程序通過spawns產(chǎn)生子進程提供服務,然后父進程退出
- oneshot:與simple類似,不過這個程序在工作完畢后就結束了,不會常駐在內存中
- dbus:與simple類似,但這個服務必須要在取得一個D-Bus的名稱后,才會繼續(xù)運行!因此設置這個項目時,通常也要設置 BusName= 才行
- idle:與simple類似,意思是,要執(zhí)行這個服務必須要所有的工作都順利執(zhí)行完畢后才會執(zhí)行。這類的服務通常是開機到最后才執(zhí)行即可的服務
- notify:與simple類似,但這個服務必須要收到一個sd_notify() 函數(shù)發(fā)送的消息后,才會繼續(xù)運行
KillMode:? ? ? ?服務停止類型,默認control-group停止時殺死所有子進程,process只殺主進程,none只停止服務,不殺進程;
?KillMode擴展:文章來源地址https://www.yii666.com/blog/347720.html
?KillMode:定義 Systemd 如何停止 sshd 服務。它可以設置的值如下:
?- ?control-group(默認值):當前控制組里面的所有子進程,都會被殺掉
?- ?process:只殺主進程
?- ?mixed:主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號
?- ?none:沒有進程會被殺掉,只是執(zhí)行服務的 stop 命令
Restart:????????服務重啟類型,默認no不重啟,on-success正常退出時重啟,on-failure非正常退出時重啟?
Restart擴展:
?Restart:定義了 sshd 退出后,Systemd 的重啟方式。它可以設置的值如下:
?- no(默認值):退出后不會重啟
?- on-success:只有正常退出時(退出狀態(tài)碼為0),才會重啟
?- on-failure:非正常退出時(退出狀態(tài)碼非0),包括被信號終止和超時,才會重啟
?- on-abnormal:只有被信號終止和超時,才會重啟
?- on-abort:只有在收到?jīng)]有捕捉到的信號終止時,才會重啟
?- on-watchdog:超時退出,才會重啟
?- always:不管是什么退出原因,總是重啟注意:對于守護進程,推薦設為on-failure。對于那些允許發(fā)生錯誤退出的服務,可以設為on-abnormal。
RestartSec:? ? ? ? 間隔多久重啟服務。?例如RestartSec=42s
TimeoutSec:? ? ? ?若這個服務在啟動或者是關閉時,因為某些緣故導致無法順利 “正常啟動或正常結束” 的情況下,則我們要等多久才進入 “強制結束” 的狀態(tài)!
RemainAfterExit:? ? ? ?當設置為 RemainAfterExit=1 時,則當這個服務所屬的所有程序都終止之后,此服務會再嘗試啟動。這對于 Type=oneshot 的服務很有幫助!
Environment:????????配置環(huán)境變量
[Service]
Environment="GODEBUG='madvdontneed=1'"
Environment="BEAT_LOG_OPTS=-e"
Environment="BEAT_CONFIG_OPTS=-c /etc/v_filebeat.yml"
Environment="BEAT_PATH_OPTS=-path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/data -path.logs /var/log/logs"
?EnvironmentFile:? ? ? ?通過文件的方式設置環(huán)境變量
[Service]
EnvironmentFile=/testenv
可以在testenv文件上以shell命令書寫變量聲明:?
GODEBUG='madvdontneed=1'
BEAT_LOG_OPTS=-e
BEAT_CONFIG_OPTS=-c /etc/v_filebeat.yml
BEAT_PATH_OPTS=-path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/data -path.logs /var/log/logs
接下來可以在 ExecStart 配置中使用在文件中設置的環(huán)境變量。?
user:????????可以設置服務的用戶名?
[Install]? ? ? 安裝部分:主要說明如何安裝這個配置文件,把該 unit 安裝在哪個 target上,做到開機自啟
WantedBy:????????這個設置后面接的大部分是 *.target unit。意思是,這個unit本身該附掛在哪個 target unit下面
?Target的含義是服務組,表示一組服務。WantedBy=multi-user.target指的是服務所在的Target是multi-user.target,對應的路徑在/etc/systemd/system/multi-user.target.wants下。使用systemctl enable,進行創(chuàng)建符號連接會識別到[Install]字段的內容進行安裝
?Systemd 有默認的啟動 Target。就是multi-user.target,在這個組里的所有服務,都將開機啟動。
Also:?????????當目前這個unit被enable時,Also 后面接的unit也要enable的意思
Alias:?? ? ? 當systemctl enable相關的服務時,則此服務會進行鏈接文件的創(chuàng)建!默認開啟!
————————————————————————————————————————
注意:配置文件,第二行ExecStart設為空值,等于取消了第一行的設置
所有的啟動設置之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發(fā)生錯誤的時候,不影響其他命令的執(zhí)行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等號后面的那個連詞號),就表示即使/etc/sysconfig/sshd文件不存在,也不會拋出錯誤。
========================================================================
二、系統(tǒng)的.target的文件信息詳解
查看系統(tǒng)的target配置命令:
systemctl cat multi-user.target
比如:/etc/systemd/system目錄下的default.target文件)
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
注意,Target 配置文件里面沒有啟動命令。
上面輸出結果中,主要字段含義如下。
Requires:????????要求basic.target一起運行。
Conflicts:沖突字段。如果rescue.service或rescue.target正在運行,multi-user.target就不能運行,反之亦然。
After:? ? ?表示multi-user.target在basic.target 、 rescue.service、 rescue.target之后啟動,如果它們有啟動的話。
AllowIsolate:????????允許使用systemctl isolate命令切換到multi-user.target。
=======================================================================
三、使用?systemctl status xxxx 的狀態(tài)信息詳解
用systemctl status命令查看一下該服務的狀態(tài)。
比如:systemctl status nginx
打印出的信息有如下部分:
● nginx.service - nginx - web server
? ?Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
? ?Active: active (running) since 日 2022-10-09 21:47:15 CST; 3 days ago
?Main PID: 994 (nginx)
? ?CGroup: /system.slice/nginx.service
? ? ? ? ? ?├─994 nginx: master process /opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
? ? ? ? ? ?├─998 nginx: worker process
? ? ? ? ? ?└─999 nginx: worker process10月 09 21:47:15 localhost.localdomain systemd[1]: Starting nginx - web server...
10月 09 21:47:15 localhost.localdomain nginx[972]: nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok
上面的輸出結果含義如下。
Loaded:????????配置文件的位置,是否設為開機啟動,disabled代表啟用
Active:????????active (running) 表示正在運行
Main PID:? ? ? ?主進程ID
CGroup:????????應用的所有子進程,三個nginx進程文章來源:http://www.zghlxwxcb.cn/news/detail-798427.html
日志塊:? ? ? ?應用的日志文章來源地址http://www.zghlxwxcb.cn/news/detail-798427.html
到了這里,關于【Linux | systemd】systemd(systemctl命令)運行服務的配置文件詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!