Linux之systemd服务配置及自动重启
Linux之systemd服務(wù)配置及自動(dòng)重啟
0 背景
在linux上開(kāi)發(fā)時(shí),往往需要將自己的程序做成服務(wù),并且實(shí)現(xiàn)服務(wù)開(kāi)機(jī)自動(dòng)重啟,以及服務(wù)崩潰后自動(dòng)重啟功能,本文就對(duì)該功能的實(shí)現(xiàn)做簡(jiǎn)單介紹,實(shí)現(xiàn)方法很簡(jiǎn)單,使用linux系統(tǒng)的systemd即可實(shí)現(xiàn)
1 systemd介紹
歷史上,linux的啟動(dòng)一直采用init進(jìn)程,比如
$ sudo /etc/init.d/apache2 start或者
$ service apache2 start這種方法有兩個(gè)缺點(diǎn)。
一是啟動(dòng)時(shí)間長(zhǎng)。init進(jìn)程是串行啟動(dòng),只有前一個(gè)進(jìn)程啟動(dòng)完,才會(huì)啟動(dòng)下一個(gè)進(jìn)程。
二是啟動(dòng)腳本復(fù)雜。init進(jìn)程只是執(zhí)行啟動(dòng)腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長(zhǎng)。
Systemd 就是為了解決這些問(wèn)題而誕生的。它的設(shè)計(jì)目標(biāo)是,為系統(tǒng)的啟動(dòng)和管理提供一套完整的解決方案。
根據(jù) Linux 慣例,字母d是守護(hù)進(jìn)程(daemon)的縮寫。 Systemd 這個(gè)名字的含義,就是它要守護(hù)整個(gè)系統(tǒng)。使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成為系統(tǒng)的第一個(gè)進(jìn)程(PID 等于 1),其他進(jìn)程都是它的子進(jìn)程。
systemctl是 Systemd 的主命令,用于管理系統(tǒng)。對(duì)于用戶來(lái)說(shuō),最常用的是下面這些命令,用于啟動(dòng)和停止 Unit(主要是 service)。
-立即啟動(dòng)一個(gè)服務(wù)
$ systemctl start apache.service-立即停止一個(gè)服務(wù)
$ systemctl stop apache.service-重啟一個(gè)服務(wù)
$ systemctl restart apache.service-殺死一個(gè)服務(wù)的所有子進(jìn)程
$ systemctl kill apache.service-重新加載一個(gè)服務(wù)的配置文件
$ systemctl reload apache.service-重載所有修改過(guò)的配置文件
$ systemctl daemon-reload-顯示某個(gè) Unit 的所有底層參數(shù)
$ systemctl show httpd.service-顯示某個(gè) Unit 的指定屬性的值
$ systemctl show -p CPUShares httpd.service-設(shè)置某個(gè) Unit 的指定屬性
$ systemctl set-property httpd.service CPUShares=500本文主要是對(duì)systemd的使用進(jìn)行介紹,如果想進(jìn)一步了解systemd的基本知識(shí),可查閱相關(guān)資料
2 服務(wù)端腳本
這里我們寫一個(gè)php的服務(wù)腳本server.php,用來(lái)實(shí)現(xiàn)一個(gè)服務(wù)
<?php $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_bind($sock, '0.0.0.0', 10000); for (;;) {socket_recvfrom($sock, $message, 1024, 0, $ip, $port);$reply = str_rot13($message);socket_sendto($sock, $reply, strlen($reply), 0, $ip, $port); }運(yùn)行后可使用lsof指令來(lái)查看端口占用情況
lthpc@lthpc:~$ lsof -i:10000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php 40446 lthpc 3u IPv4 37381218 0t0 UDP *:10000使用nc指令模擬客戶端測(cè)試
$ nc -u 127.0.0.1 10000 Hello, world! Uryyb, jbeyq!3 創(chuàng)建服務(wù)
接下來(lái)使用systemd創(chuàng)建一個(gè)服務(wù),寫一個(gè)服務(wù)配置文件/etc/systemd/system/rot13.service
有幾點(diǎn)需要注意,為了使服務(wù)能夠自動(dòng)無(wú)限次重啟,需要增加以下幾個(gè)配置
StartLimitIntervalSec=0Restart=alwaysRestartSec=1關(guān)于配置文件的具體參數(shù)含義,可參考該文檔
設(shè)置好后,可以運(yùn)行如下語(yǔ)句啟動(dòng)服務(wù)
$ systemctl start rot13運(yùn)行后,便啟動(dòng)了名為rot13的服務(wù),可使用status查看服務(wù)狀態(tài)
lthpc@lthpc:~/workspace_zong/tcptest$ systemctl status rot13 ● rot13.service - ROT13 demo serviceLoaded: loaded (/etc/systemd/system/rot13.service; disabled; vendor preset: enabled)Active: active (running) since 一 2019-10-28 11:25:43 CST; 1min 28s agoMain PID: 44532 (php)Tasks: 1Memory: 5.2MCPU: 24msCGroup: /system.slice/rot13.service└─44532 php /home/lthpc/workspace_zong/tcptest/server.php10月 28 11:25:43 lthpc systemd[1]: Started ROT13 demo service.為了開(kāi)機(jī)自動(dòng)啟動(dòng),執(zhí)行下以下語(yǔ)句
$ systemctl enable rot13同樣的,可以使用nc指令模擬客戶端測(cè)試,可以看到服務(wù)已經(jīng)正常啟動(dòng)運(yùn)行了!
4 自動(dòng)重啟
為了測(cè)試是否可以正常自動(dòng)重啟,我們手動(dòng)殺掉啟動(dòng)的服務(wù)進(jìn)程,再查看進(jìn)程號(hào)發(fā)現(xiàn)已經(jīng)更換PID號(hào)了,說(shuō)明重啟過(guò)進(jìn)程,并且使用nc -u 127.0.0.1 10000指令測(cè)試依然可以調(diào)用服務(wù)
注意輸入systemctl stop rot13時(shí)服務(wù)是不會(huì)重啟的,所以如果有參數(shù)需要修改,直接運(yùn)行stop指令改完再start就可以了
編寫服務(wù)配置
vim /lib/systemd/system/website.service[Unit] Description=website After=network.target[Service] Type=forking ExecStart=/home/monitor/website/start.sh ExecReload=/home/monitor/website/restart.sh ExecStop=/home/monitor/website/shutdown.sh[Install] WantedBy=multi-user.target編寫對(duì)應(yīng)啟動(dòng)停止等腳本
開(kāi)啟:
關(guān)閉:
vim?/home/monitor/website/shutdown.sh #!/bin/sh ps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9重啟:
vim?/home/monitor/website/restart.sh #!/bin/sh export JAVA_HOME=/usr/java/jdk1.8.0_144 export PATH=$JAVA_HOME/bin:$PATHps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9 nohup java -jar /home/monitor/website/demo-0.0.1-SNAPSHOT.jar &授權(quán)運(yùn)行:
chmod +x?start.sh shutdown.sh restart.sh配置自啟動(dòng)
開(kāi)機(jī)啟動(dòng):systemctl enable website
啟動(dòng):systemctl start website
關(guān)閉:systemctl stop website
重啟:systemctl restart website
查看狀態(tài):systemctl status website
修改服務(wù)配置重新生效:systemctl daemon-reload
常見(jiàn)systemctl錯(cuò)誤碼
| code | desc |
|:------|:---------------------------------------------------------|
| 0 | 命令成功結(jié)束 |
| 1 | 通用未知錯(cuò)誤 |
| 2 | 誤用shell命令 |
| 126 | 命令不可執(zhí)行 |
| 127 | 沒(méi)找到命令 |
| 128 | 無(wú)效退出參數(shù) |
| 128+x | Linux 信號(hào)x的嚴(yán)重錯(cuò)誤 |
| 130 | Linux 信號(hào)2 的嚴(yán)重錯(cuò)誤,即命令通過(guò)SIGINT(Ctrl+C)終止 |
| 203 | 缺失腳本執(zhí)行器標(biāo)識(shí) |
| 255 | 退出狀態(tài)碼越界 |
備注
如運(yùn)行sh腳本報(bào)出如下錯(cuò)誤:
/bin/sh^M: 壞的解釋器: 沒(méi)有那個(gè)文件或目錄
是由于在windows下編輯的腳本文件拷貝至linux導(dǎo)致的,windows下編輯文本每一行結(jié)尾是\n\r,而Linux下則是\n,
解決方法:
在終端輸入sed -i 's/\r$//' daemon.sh
sed -i 's/\r$//' daemon.sh 會(huì)把make-all-linux-project.sh中的行尾的\r替換為空白,其中daemon.sh為報(bào)錯(cuò)的腳本。
為避免該錯(cuò)誤,可以直接在linux新建腳本或者再linux環(huán)境下拷貝。
總結(jié)
以上是生活随笔為你收集整理的Linux之systemd服务配置及自动重启的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SQL优化方法
- 下一篇: linux相关(find/grep/aw