layout: post

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

date: 2019-09-09

tags: linux

---

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,用来实现一个服务

$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指令来查看端口占用情况

[email protected]:~$ 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=0

Restart=always

RestartSec=1

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

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

$ systemctl start rot13

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

[email protected]:~/workspace_zong/tcptest$ systemctl status rot13

● rot13.service - ROT13 demo service

Loaded: loaded (/etc/systemd/system/rot13.service; disabled; vendor preset: enabled)

Active: active (running) since 一 2019-10-28 11:25:43 CST; 1min 28s ago

Main PID: 44532 (php)

Tasks: 1

Memory: 5.2M

CPU: 24ms

CGroup: /system.slice/rot13.service

└─44532 php /home/lthpc/workspace_zong/tcptest/server.php

10月 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 PID

Main PID: 44532 (php)

$ sudo kill 44532

$ systemctl status rot13 | grep PID

Main 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:$PATH

nohup 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:$PATH

ps -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环境下拷贝。

原文:https://www.cnblogs.com/nxzblogs/p/11755972.html

linux一运行大文件就自动重启,Linux之systemd服务配置及自动重启相关推荐

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

    Linux之systemd服务配置及自动重启 0 背景 在linux上开发时,往往需要将自己的程序做成服务,并且实现服务开机自动重启,以及服务崩溃后自动重启功能,本文就对该功能的实现做简单介绍,实现方 ...

  2. linux 怎么删除大文件,详解在Linux中清空或删除大文件内容的5种方法

    有时,在处理Linux终端中的文件时,您可能希望清除文件的内容,而无需使用任何Linux命令行编辑器打开它.怎么能实现这一目标?在本文中,我们将借助一些有用的命令,通过几种不同的方式清空文件内容. 警 ...

  3. linux服务器运行matlab文件报错

    linux服务器运行matlab文件报错 在linux服务器上安装matlab之后,如果想要运行matlab程序,通常的做法是先cd到matlab文件所在的文件夹,然后输入指令 % 假定matlab文 ...

  4. linux cp后文件变大,使用 rsync 复制大文件的一些误解 | Linux 中国

    原标题:使用 rsync 复制大文件的一些误解 | Linux 中国 这位朋友认为 rsync 是一个神奇的工具,应该仅"同步"文件本身.但是,我们大多数人所忘记的是了解 rsyn ...

  5. 查看服务器大文件,linux 查看服务器大文件

    linux 查看服务器大文件 内容精选 换一换 当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的.本章节以Windows 2012版本操作系统为例进行NF ...

  6. 如何快速清空 Linux 中的大文件

    本文总结了几种快速清空Linux中的大文件方法,快来看看对你有帮助吗? 1. 通过重定向到null清空文件内容 使用 shell 重定向null(不存在的对象)到文件的最简单方法来清空文件内容 # & ...

  7. Linux如何查找大文件或目录总结

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  8. linux如何找大文件夹,Linux系统中如何查找大文件或目录文件夹的方法

    Linux系统中如何查找大文件或文件夹的方法 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整 ...

  9. linux中替换文件中的内容,linux下批量替换文件中的内容linux操作系统 -电脑资料...

    对于单个文件,使用sed命令很容易做到, grep命令可以查找单个文件或文件夹下文件中的内容,使用参数"r"或"-R"可以递归查找指定文件夹下的所有文件:参数& ...

最新文章

  1. ubuntu联网经常掉线的解决方法
  2. 原来 CPU 为程序性能优化做了这么多
  3. windows端自动化遇到的问题
  4. Webkit 最新 Javascript 引擎领先 Chrome
  5. rhel6.0配置rsyslog传送日志到远程主机
  6. python编程有用吗-编程小白提问Python好吗?它的用途?
  7. vs2010 unresolved external symbol error
  8. why in GM0 the extAddTo Controller is not loaded
  9. Java接口有时有结果 有时没有_《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法...
  10. javascript --- Object.assign()浅复制解决方法
  11. notepad++ 使用去掉自动检查红线
  12. linux github代码仓库,centos7上使用git命令把代码放到github上
  13. 设计模式笔记二十:观察者模式 |更新版
  14. 百度邮件曝光:高级技术总监接管CTO工作
  15. 【学习总结】Git学习-参考廖雪峰老师教程三-创建版本库
  16. traceroute显示*号_traceroute 的名词解释
  17. 五万以内买什么车合适?
  18. 吉林大学高等数学A3作业答案新版
  19. 什么是python基础语法?一篇文章让你更加了解python
  20. 爬虫(七)通过Selenium爬取网易云音乐评论

热门文章

  1. 照魔兽世界食谱做肉餐
  2. 软件推荐【2016-3-12 17:28:46】
  3. 单开双控_什么叫单开双控开关 单控开关和双控开关的区别
  4. 英语从零到过英语4级不是梦,跟我一起考过四级!!!!!!
  5. 如何合并视频?这几种视频合并方法既简单又实用
  6. Uniontechos-server-20 1050e统信UOS服务器版V20安装
  7. 186页13万字智慧能源大数据分析平台建设方案
  8. java支持库(_Java运行环境支持库下载-Java Runtime Environment(JRE) v9.1.8官方64位版-ucbug下载站...
  9. linux 复制文件生效命令,linux复制并覆盖文件使用什么命令
  10. 9012 年了,还在抄,我应该高兴,还是高兴,还是高兴