systemd服务详解
模塊概述
[Unit]部分
主要是對這個服務的說明,內容, 文檔介紹以及對一些依賴服務定義
- Description:描述信息
- After:表明需要依賴的服務,作用決定啟動順序
- Before:表明被依賴的服務
- Requles:依賴到的其他unit ,強依賴,即依賴的unit啟動失敗。該unit不啟動。
- Wants:依賴到的其他unit,弱依賴,即依賴的unit 啟動失敗。該unit繼續啟動
- Conflicts:定義沖突關系
處理依賴關系
使用systemd時,可通過正確編寫單元配置文件來解決其依賴關系。典型的情況是,單元A要求單元B在A啟動之前運行。在此情況下,向單元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依賴關系是可選的,可添加 Wants=B 和 After=B。請注意 Wants= 和 Requires= 并不意味著 After=,即如果 After= 選項沒有制定,這兩個單元將被并行啟動。依賴關系通常被用在服務(service)而不是目標(target)上。例如, network.target 一般會被某個配置網絡接口的服務引入,所以,將自定義的單元排在該服務之后即可,因為 network.target 已經啟動。[Service]部分
服務的主體定義,主要定義服務的一些運行參數,及操作動作
-
Type:
- simple: 默認值,執行ExecStart指定的命令,啟動主進程
- forking: 以 fork 方式從父進程創建子進程,創建后父進程會立即退出,子進程將成為主進程
- oneshot: 一次性進程,類似于simple,但只執行一次,Systemd 會等當前服務退出,再繼續往下執行
- dbus: 當前服務通過D-Bus啟動,類似于simple,但會等待 D-Bus 信號后啟動
- notify: 當前服務啟動完畢,會發出通知信號通知Systemd,然后 Systemd 再繼續啟動其他服務
- idle: 類似于simple,但是要等到其他任務都執行完畢,才會啟動該服務。一種使用場合是為讓該服務的輸出,不與其他服務的輸出相混合
-
User:指定開機自動運行該程序的用戶名
-
Group:指定開機自動運行該程序的用戶組
-
LimitCORE=infinity:限制內核文件的大小
-
LimitNOFILE=65536:服務最大允許打開的文件描述符數量
-
LimitNPROC=65536:進程的最大數量
-
PIDFile:指定開機自動運行該程序的pid文件(一般在程序配置文件中配置該項)
-
ExecStart:啟動當前服務的命令
-
ExecStartPre:啟動當前服務之前執行的命令
-
ExecStartPost:啟動當前服務之后執行的命令
-
ExecReload:重啟當前服務時執行的命令
-
ExecStop:停止當前服務時執行的命令
-
ExecStopPost:停止當其服務之后執行的命令
-
KillMode:定義如何停止服務。KillMode字段可以設置的值如下
- control-group(默認值):當前控制組里面的所有子進程,都會被殺掉;
- process:只殺主進程;
- mixed:主進程將收到SIGTERM信號,子進程收到SIGKILL信號;
- none:沒有進程會被殺掉,只是執行服務的stop命令。如ssh服務將KillMode設為process,不停止任何sshd子進程,即子進程打開的SSH session仍然保持連接,這個設置不太常見,但對 sshd 很重要,否則你停止服務的時候,會連自己打開的 SSH session一起殺掉。
-
KillSignal: 設置殺死進程的第一步使用什么信號, 默認值為 SIGTERM 信號。
-
RestartSec:自動重啟當前服務等待的秒數
-
Restart:定義了當前服務退出后,Systemd的重啟方式,可能的值包括
- no(默認值):退出后不會重啟;
- always:不管是什么退出原因,總是重啟;
- on-success:只有正常退出時(退出狀態碼為0),才會重啟;
- on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,才會重啟;
- on-abnormal:只有被信號終止和超時,才會重啟;
- on-abort:只有在收到沒有捕捉到的信號終止時,才會重啟;
- on-watchdog:超時退出,才會重啟,如ssh服務設置為on-failure,表示任何意外的失敗,就將重啟sshd。如果sshd正常停止(比如執行systemctl stop命令),它就不會重啟。
-
RemainAfterExit:值為yes或no,表示進程退出以后,服務仍然保持執行。這樣的話,一旦使用systemctl stop命令停止服務,ExecStop指定的命令就會執行
-
TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數
-
Environment:指定當前服務的環境變量
-
EnvironmentFile:指定當前服務的環境參數文件,該文件的key=value鍵值對,可以用$key的形式,在當前配置文件中獲取
-
所有的啟動設置都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行。比如,EnvironmentFile=-/etc/sysconfig/sshd,表示即使/etc/sysconfig/sshd文件不存在,也不會拋出錯誤。
-
PrivateTmp 的值設置成true ,服務啟動時會在/tmp目錄下生成類似systemd-private-433ef27ba3d46d8aac286aeb1390e1b-nginx.service-RedVyu的文件夾,用于存放nginx的臨時文件。
[Install]部分
服務安裝的相關設置,一般可設置為多用戶的
- WantedBy:它的值是一個或多個 Target,當前 Unit 激活時(enable)符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .wants后綴構成的子目錄中
- RequiredBy:它的值是一個或多個 Target,當前 Unit 激活時,符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .required后綴構成的子目錄中
- Alias:當前 Unit 可用于啟動的別名
- Also:當前 Unit 激活(enable)時,會被同時激活的其他 Unit
配置文件示例
sshd服務
[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 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.targetnginx服務
[Unit] Description=The nginx HTTP and reverse proxy server After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target[Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/usr/sbin/nginx -s reload KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true[Install] WantedBy=multi-user.targetTomcat服務
## YUM安裝 [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target[Service] Type=simple EnvironmentFile=/etc/tomcat/tomcat.conf Environment="NAME=" EnvironmentFile=-/etc/sysconfig/tomcat ExecStart=/usr/libexec/tomcat/server start SuccessExitStatus=143 User=tomcat[Install] WantedBy=multi-user.target## 二進制安裝 [Unit] Description=tomcat After=network.target[Service] Type=forking Environment="export JAVA_HOME=/opt/jdk" Environment="export JAVA_BIN=$JAVA_HOME/bin" Environment="export JRE_HOME=$JAVA_HOME/jre" Environment="export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib" Environment="export PATH=$PATH:$JAVA_HOME/bin" ExecStart=/usr/local/tomcat/bin/startup.sh ExecStop=/usr/local/tomcat/bin/shutdown.sh Restart=on-failure[Install] WantedBy=multi-user.targetjava服務
[Unit] Description=Manage Java service After=network.target[Service] Type=simple User=loan Group=loan WorkingDirectory=/app ExecStart=/bin/bash -c "source /etc/profile; java -Xms8192m -Xmx8192m -XX:PermSize=4096m -XX:MaxPermSize=4096m -jar online-server-1.0-SNAPSHOT.jar>/app/online-server.log 2>&1" StandardOutput=null StandardError=null Restart=on-failure StartLimitInterval=120 StartLimitBurst=3 ReStartSec=5[Install] WantedBy=multi-user.targetStartLimitInterval=120
StartLimitBurst=3
ReStartSec=5
表示2分鐘內服務重啟超過3次(每次重啟間隔5s), 就不再重啟了
StandardOutput=null
StandardError=null
不將程序日志輸出到syslog
kill與信號量
TERM
- 發送 TERM 信號到指定進程,如果進程沒有捕獲該信號,則進程終止
- If no signal is specified, the TERM signal is sent. The TERM signal will kill processes which do not catch this signal.
語法格式
kill -s TERM <pid>systemd用法 ExecStop=/bin/kill -s TERM $MAINPID友好告訴進程退出,進程先保存好數據,再正常退出。
給父進程發送一個 TERM 信號,試圖殺死它和它的子進程。
請求徹底終止某項執行操作.它期望接收進程清除自給的狀態并退出
HUP
- 讓 Linux 緩和的執行進程關閉,然后重啟。在對配置文件修改后需要重啟進程時可發送此信號。
語法格式
kill -s HUP <pid>systemd用法 ExecReload=/bin/kill -s HUP $MAINPIDQUIT
等同于Ctrl + C
systemd用法 ExecStop=/bin/kill -s QUIT $MAINPID總結
以上是生活随笔為你收集整理的systemd服务详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Linux系统下安装更换操作系统
- 下一篇: MVC中集成Hangfire定时任务