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

0 背景

在linux上开发时,往往需要将自己的程序做成服务,并且实现服务开机自动重启,以及服务崩溃后自动重启功能,本文就对该功能的实现做简单介绍,实现方法很简单,使用linux系统的systemd即可实现

1 systemd介绍

历史上,linux的启动一直采用init进程,比如

$ sudo /etc/init.d/apache2 start

或者

$ service apache2 start

这种方法有两个缺点。

一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。

根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

systemctl是 Systemd 的主命令,用于管理系统。对于用户来说,最常用的是下面这些命令,用于启动和停止 Unit(主要是 service)。

-立即启动一个服务

$ systemctl start apache.service

-立即停止一个服务

$ systemctl stop apache.service

-重启一个服务

$ systemctl restart apache.service

-杀死一个服务的所有子进程

$ systemctl kill apache.service

-重新加载一个服务的配置文件

$ systemctl reload apache.service

-重载所有修改过的配置文件

$ systemctl daemon-reload

-显示某个 Unit 的所有底层参数

$ systemctl show httpd.service

-显示某个 Unit 的指定属性的值

$ systemctl show -p CPUShares httpd.service

-设置某个 Unit 的指定属性

$ systemctl set-property httpd.service CPUShares=500

本文主要是对systemd的使用进行介绍,如果想进一步了解systemd的基本知识,可查阅相关资料

2 服务端脚本

这里我们写一个php的服务脚本server.php,用来实现一个服务


<?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);
}

运行后可使用lsof指令来查看端口占用情况

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指令模拟客户端测试

$ nc -u 127.0.0.1 10000
Hello, world!
Uryyb, jbeyq!

3 创建服务
接下来使用systemd创建一个服务,写一个服务配置文件/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

有几点需要注意,为了使服务能够自动无限次重启,需要增加以下几个配置

StartLimitIntervalSec=0Restart=alwaysRestartSec=1

关于配置文件的具体参数含义,可参考该文档

设置好后,可以运行如下语句启动服务

$ systemctl start rot13

运行后,便启动了名为rot13的服务,可使用status查看服务状态

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.

为了开机自动启动,执行下以下语句

$ systemctl enable rot13

同样的,可以使用nc指令模拟客户端测试,可以看到服务已经正常启动运行了!

4 自动重启
为了测试是否可以正常自动重启,我们手动杀掉启动的服务进程,再查看进程号发现已经更换PID号了,说明重启过进程,并且使用nc -u 127.0.0.1 10000指令测试依然可以调用服务

$ systemctl status rot13 | grep PIDMain PID: 44532 (php)
$ sudo kill 44532
$ systemctl status rot13 | grep PIDMain PID: 44255 (php)

注意输入systemctl stop rot13时服务是不会重启的,所以如果有参数需要修改,直接运行stop指令改完再start就可以了


编写服务配置

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

编写对应启动停止等脚本
开启:

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 &

关闭:

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 &

授权运行:

chmod +x start.sh shutdown.sh restart.sh

配置自启动
开机启动:systemctl enable website

启动:systemctl start website

关闭:systemctl stop website

重启:systemctl restart website

查看状态:systemctl status website

修改服务配置重新生效:systemctl daemon-reload

常见systemctl错误码
| code | desc |
|:------|:---------------------------------------------------------|
| 0 | 命令成功结束 |
| 1 | 通用未知错误 |
| 2 | 误用shell命令 |
| 126 | 命令不可执行 |
| 127 | 没找到命令 |
| 128 | 无效退出参数 |
| 128+x | Linux 信号x的严重错误 |
| 130 | Linux 信号2 的严重错误,即命令通过SIGINT(Ctrl+C)终止 |
| 203 | 缺失脚本执行器标识 |
| 255 | 退出状态码越界 |

备注
如运行sh脚本报出如下错误:
/bin/sh^M: 坏的解释器: 没有那个文件或目录
是由于在windows下编辑的脚本文件拷贝至linux导致的,windows下编辑文本每一行结尾是\n\r,而Linux下则是\n,
解决方法:
在终端输入sed -i 's/\r$//' daemon.sh
sed -i 's/\r$//' daemon.sh 会把make-all-linux-project.sh中的行尾的\r替换为空白,其中daemon.sh为报错的脚本。
为避免该错误,可以直接在linux新建脚本或者再linux环境下拷贝。

Linux之systemd服务配置及自动重启相关推荐

  1. linux一运行大文件就自动重启,Linux之systemd服务配置及自动重启

    layout: post title: Linux之systemd服务配置及自动重启 date: 2019-09-09 tags: linux --- Linux之systemd服务配置及自动重启 0 ...

  2. linux ntp时间同步配置,Linux ntp 时间同步服务配置

    一.基础环境 1.操作系统:CentOS 7.3 2.ntp:4.2.6 3.机器,服务端(192.168.1.210)客户端(192.168.1.211) 二.安装ntp yum -y instal ...

  3. 监控windows某个服务当服务停止后自动重启服务

    近期花时间研究了一下windows和linux下某服务停了后自动重启的功能,在网上收集了些资料,并经过测试,在此整理一下.这里介绍的是windows服务的监控,是通过批处理来实现的.本例是监控wind ...

  4. Linux 之systemd服务简介

    Linux 之systemd服务简介 Systemd机制 systemd是Linux下的一种init软件,作用是提供更优秀的框架以表示系统服务之间的依赖关系,并依次实现系统初始化时服务的并行启动,同时 ...

  5. linux进程监控自动重启,Linux监控进程,进程关闭自动重启方案

    Linux监控进程,进程关闭自动重启方案 corntab+shell脚本检测进程 这个方案简单不用额外安装软件. 缺点是存在间隔,corntab设置1秒执行一次shell脚本也是存在间隔的 #!/bi ...

  6. linux杀掉进程后总是重启,Linux监控进程,进程关闭自动重启方案

    Linux监控进程,进程关闭自动重启方案 corntab+shell脚本检测进程 这个方案简单不用额外安装软件. 缺点是存在间隔,corntab设置1秒执行一次shell脚本也是存在间隔的 #!/bi ...

  7. linux shell脚本监控进程崩溃自动重启

    linux shell脚本监控进程崩溃自动重启,由于目前有Python实现的通讯组件时不时会异常中断,在还没有找到问题的解决办法时先暂时用shell监控并自动重启处理. # ! /bin/shbase ...

  8. Linux系统管理及服务配置

    最近在学习Linux,特此记录一下 Linux系统管理及服务配置 1.文件管理 1.文件类型(理解) 简介 windows文件类型以后缀区分. exe doc linux文件类型以单个字母区分(文件属 ...

  9. linux可配置哪些服务,linux操作系统下服务配置

    linux操作系统下服务配置 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 17.90 积分 实用标准文案数学与信息技术学院实 验 报 告实验课程名 ...

最新文章

  1. Windows 95被做成了App,可玩扫雷和纸牌
  2. [攻克存储] 掌握SDRAM/DDR的结构与寻址
  3. C++中的内联函数inline总结
  4. 操作多个表_2_组合相关的行
  5. 嫦娥之死天蓬元帅的转世
  6. Java学习路线详解
  7. Ubuntu16.04安装
  8. 【李宏毅2020 ML/DL】P11 Logistic Regression | 由逻辑回归中的特征转换巧妙引出“神经网络”的概念
  9. Java中关于字符类型在Unicode表中表示
  10. 漏洞自动扫描神器AWVS 11安装与使用教程
  11. java 同步线程方式
  12. mingw编译CMake后的OpenCV文件时出现:mingw32-make : 无法将“mingw32-make”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  13. linux下无线网卡做热点,用ArchLinux做wifi热点无线路由
  14. spring基于注解的AOP配置 中的环绕通知 步骤写法
  15. 使用jupyter环境在数据集处理中遇到.ipynb_checkpoints no such file or directory的问题
  16. 大学生程序设计邀请赛(华东师范大学)A. 拼音魔法
  17. Wi-Fi Display
  18. css3半圆弧线,css3实现画半圆弧线的示例代码
  19. 海量数据大课学习笔记(8)-账号微服务注册模块+短信验证码+阿里云OSS开发实战-小滴课堂
  20. 北京爱立信的面试题及流程

热门文章

  1. python控制步进电机代码tx2_步进电机C语言控制,高手请进来指点一下!
  2. 一千行 MySQL 详细学习笔记
  3. java 远程 shell脚本_Java 远程调用 shell脚本
  4. mysql global temporary table_【转】MySQL Temporary Table相关问题的探究
  5. mysql5.6兼容包_freebsd9.1源码安装apache、mysql、php环境(亲侧通过)
  6. 元素类型为 “resultMap” 的内容必须匹配 “(constructor?,id*,result*,association*,collection*,discriminator?)”
  7. Files.newDirectoryStream扫描/过滤目录文件
  8. mysql hex函数性能_mysql hex与unhex 函数的妙用
  9. mysql2008安装中文_Microsoft SQL Server 2008 R2 中文安装说明
  10. python读excel 包含格式_python里读写excel等数据文件的几种常用方式