首页 > 系统相关 >Linux下注册系统服务

Linux下注册系统服务

时间:2024-04-20 19:12:10浏览次数:22  
标签:systemd 服务 启动 init 注册 Linux test Unit

前言

init

历史上,Linux 的启动一直采用 init 进程。在类 Unix 的计算机操作系统中,init(初始化的简称)是在启动计算机系统期间启动的第一个进程。init 是一个守护进程,它将持续运行,直到系统关闭。它是所有其他进程的直接或间接的父进程。因为 init 的参数全在/etc/init.d目录下,所以使用 init 启动一个服务,应该这样做:

sudo /etc/init.d/nginx start

service

service 是一个运行System V init的脚本命令。那么什么是 System V init 呢?也就是 /etc/init.d 目录下的参数。所以分析可知 service 是去/etc/init.d目录下执行相关程序,服务配置文件的存放目录就是/etc/init.d。

使用 service 启动一个服务

service nginx start

可以理解成 service 就是 init.d 的一种实现方式。
所以这两者启动方式(或者是停止、重启)并没有什么区别。

sudo /etc/init.d/nginx start
// 等价于
service nginx start

但是这两种方式均有如下缺点:

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

systemd

systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 systemd 这个名字的含义,就是它要守护整个系统。

使用了 systemd,就不需要再用 init 了。systemd 取代了initd,成为系统的第一个进程(pid 等于 1),其他进程都是它的子进程。

systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。systemctl 是 systemd 的主命令,用于管理系统。

总结

  • init 是最初的进程管理方式
  • service 是 init 的另一种实现
  • systemd 则是一种取代 initd 的解决方案

使用

将程序注册为系统服务,需要编辑 xxx.service 配置文件,并将文件存储到 /usr/lib/systemd/system/ 目录下

配置文件介绍

[Unit] 区块:启动顺序与依赖关系。
  • Description:简短描述
  • Documentation:文档地址
  • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
  • Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
  • BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
  • Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
  • After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
[Service] 区块:启动行为
  • Type:定义启动时的进程行为。它有以下几种值。
    • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
    • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
    • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
    • Type=dbus:当前服务通过D-Bus启动
    • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
    • Type=idle:若有其他任务执行完毕,当前服务才会运行
  • ExecStart:启动当前服务的命令
  • ExecStartPre:启动当前服务之前执行的命令
  • ExecStartPost:启动当前服务之后执行的命令
  • ExecReload:重启当前服务时执行的命令
  • ExecStop:停止当前服务时执行的命令
  • ExecStopPost:停止当其服务之后执行的命令
  • RestartSec:自动重启当前服务间隔的秒数
  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
  • Environment:指定环境变量

注意:Type=simple 时,如果启动脚本中 以 nohup & 形式启动进程时,此时启动脚本后会自动 kill 当前服务。

[Install] 区块

定义如何安装这个配置文件,即怎样做到开机启动。

  • WantedBy字段:表示该服务所在的 Target。

Target的含义是服务组,表示一组服务。默认的启动 Target 就是 multi-user.target(多用户命令行))。在这个组里的所有服务,都将开机启动。这就是为什么 systemctl enable 命令能设置开机启动的原因。

程序准备

这里我们注册的服务名为 test_systemd.service

[Unit]
Description=test program
After=network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/root/test_systemd/test_systemd_start.sh
ExecStop=/bin/kill -9 $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

服务启动要执行的程序为 test_systemd_start.sh

#!/bin/bash
/root/test_systemd/test_while.sh >> /dev/null

test_while.sh 程序内容为

#!/bin/bash
i=1
while [ $i -le 10000  ];do
    let i=$i+1
    sleep 10
    echo `date` >> /root/test_systemd/while_sh.log
done

总结如下

  1. 我们要注册的服务,启动要做的操作为:开启一个进程,每隔10秒,向 while_sh.log 日志文件追加一条日志记录
  2. 停止要做的操作为:将上面的进程给 kill 掉

验证

chmod a+x test_systemd_start.sh # 添加执行权限
chmod a+x test_while.sh
cp test_systemd.service /usr/lib/systemd/system/ # 将配置文件拷贝到指定目录
systemctl daemon-reload # 重新加载配置文件
systemctl start test_systemd # 等价于 systemctl start test_systemd.service
tail -f /root/test_systemd/while_sh.log

常用命令为

systemctl  status  xxx      # 查看服务状态
systemctl  start  xxx       # 启动服务
systemctl  stop  xxx        # 停止服务
systemctl  restart  xxx     # 重启服务
systemctl  enable  xxx      # 启用服务开机自启动
systemctl  disable  xxx     # 禁止服务开机自启动

如果启动失败,可以通过以下命令排查

systemctl  status  xxx
journalctl -xe

参考

Systemd 入门教程:命令篇
Systemd 入门教程:实战篇
Linux init、service、systemctl 三者区别
Linux:注册系统服务

标签:systemd,服务,启动,init,注册,Linux,test,Unit
From: https://www.cnblogs.com/strongmore/p/18114626

相关文章

  • linux8-ssh远程管理
    1.网络配置使用nmtui命令或进入配置文件修改配置为静态1vim/etc/sysconfig/network-scripts/ifcfg-ens1602TYPE=Ethernet3PROXY_METHOD=none4BROWSER_ONLY=no5BOOTPROTO=none6DEFROUTE=yes7IPV4_FAILURE_FATAL=no8IPV6INIT=yes9IPV6_AUTOCONF=yes1......
  • linux7-iptables与firewall
    1.iptables 1规则链的默认策略拒绝动作只能是DROP,而不能是REJECT。2在日常运维工作中,经常会使用ping命令来检查对方主机是否在线,而向防火墙的INPUT3规则链中添加一条允许ICMP流量进入的策略规则就默认允许了这种ping命令检测行为。4[root@linuxprobe~]#iptable......
  • Linux安装软件方式
    这里以centos为例yum安装  yumsearch[软件关键字]  yum-yinstall[软件名]  二进制安装  使用wget下载tar.gz包——在tar-zxf解压包——进入解压目录执行相关文件——缺少依赖库则使用ldd加上上一步的执行文件——使用yum下载依赖库  依赖库没问题后则执行......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——服务端注册实现原理分析
    远程过程调用RPC——服务端注册实现原理分析rpcserver代码参考我前一篇博文:https://www.cnblogs.com/zuoyang/p/18146870RPCServer端的RPC代码架构主要由两大部分构成:第一部分是服务方法的注册过程。在这个过程中,我们首先通过调用rpc.Register接口将服......
  • linux5-用户权限
    1.id+用户名显示用户详细信息1[root@linuxprobe~]#idlinuxprobe2uid=1000(linuxprobe)gid=1000(linuxprobe)groups=1000(linuxprobe)2.useradd创建用户1[root@linuxprobe~]#useraddlinuxcool2[root@linuxprobe~]#idlinuxcool3uid=1001(linuxcool)gid=10......
  • linux4-vim与shell脚本
    1.vim+文件名编辑文件a、i、o进入输入模式,esc退出输入模式; :w保存:q退出:q!强制退出2.vim/etc/hostname修改主机名3./etc/sysconfig/network-scripts此目录中修改网卡信息1TYPE=Ethernet//设备类型2BOOTPROTO=static//ip分配模式3......
  • 性能测试——性能测试-linux监控工具-Centos7.x安装Node_exporter
    参考小菠萝博客笔记:https://www.cnblogs.com/poloyy/p/12375039.html 小菠萝是在一个服务器上面装的,我是2个服务器分别装的,下面需要新增一个命令:useraddprometheus    NODE_PATH='/data/prometheus/node_exporter/'cd/usr/local/src/mkdir-p${NODE_PATH}wget......
  • linux3-管道符、重定向、环境变量
    1.>输出重定向1[root@linuxprobe~]#manbash>readme.txt//将bash的使用手册写入readme.txt2[root@linuxprobe~]#catreadme.txt3BASH(1)GeneralCommandsManualBASH(1)4覆盖重定向5[root@linuxprobe~]#echo"WelcometoLinuxProbe.Com">readme.t......
  • 性能测试——性能测试-linux监控工具-Centos7.x安装Prometheus
    此处参考小菠萝文档:https://www.cnblogs.com/poloyy/p/12375039.html 下载安装PrometheusPROM_PATH='/data/prometheus'mkdir-p${PROM_PATH}mkdir-p${PROM_PATH}/{data,conf,logs,bin}useraddprometheuscd/usr/local/srcwgethttps://github.com/prometheus/prom......
  • 基础 IO (Linux学习笔记)
    基础IO1.重谈文件空文件在磁盘也要占据空间文件=内容+属性文件操作=对文件内容+对属性or对文件内容加属性标定一个文件,必须使用文件路径加文件名【唯一性】如果没有指明对应得文件路径,默认是在当前路径下进行文件访问当写了一个跟文件操作有关得程序,编译后,文件......