日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Linux之systemd服务配置及自动重启

發(fā)布時(shí)間:2024/9/15 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux之systemd服务配置及自动重启 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

[Unit] Description=ROT13 demo service After=network.target StartLimitIntervalSec=0[Service] Type=simple Restart=always RestartSec=1 User=ltpc ExecStart=/usr/bin/env php /path/to/server.php[Install] WantedBy=multi-user.target

有幾點(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 status rot13 | grep PIDMain PID: 44532 (php) $ sudo kill 44532 $ systemctl status rot13 | grep PIDMain PID: 44255 (php)

注意輸入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)啟:

vim?/home/monitor/website/start.sh #!/bin/sh export JAVA_HOME=/usr/java/jdk1.8.0_144 export PATH=$JAVA_HOME/bin:$PATHnohup java -jar /home/monitor/website/demo-0.0.1-SNAPSHOT.jar &

關(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。