利用linux的systemd来守护进程或服务

一、Linux系统的运行等级

Runlevel

Description

0

停止系统。运行等级 0 是一个用于快速关闭系统的特殊过渡状态。

1

别名为 s 或 S,这个运行等级有时候也称为维护模式。在这个运行等级启动的服务由于发行版不同而不同。通常用于正常系统操作损坏时低级别的系统维护。

2

多用户。在 Debian 系统及其衍生版中,这是默认的运行等级,还包括了一个图形化登录(如果有的话)。在基于红帽的系统中,这是没有网络的多用户模式。

3

在基于红帽的系统中,这是默认的多用户模式,运行除了图形化环境以外的所有东西。基于 Debian 的系统中通常不会使用这个运行等级以及等级 4 和 5。

4

通常默认情况下不使用,可用于自定制。

5

基于红帽的系统中,支持 GUI 登录的完全多用户模式。这个运行等级和等级 3 类似,但是有可用的 GUI 登录。

6

重启系统。

二、Systemd的基础知识

[Unit]

参数说明:

  1. Description:简短描述
  2. Documentation:文档地址
  3. Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
  4. Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
  5. BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
  6. Before:如果该字段指定的Unit 也要启动,那么必须在当前 Unit 之后启动
  7. After:如果该字段指定的Unit 也要启动,那么必须在当前 Unit 之前启动
  8. Conflicts:这里指定的Unit 不能与当前 Unit 同时运行
  9. Condition...:当前Unit 运行必须满足的条件,否则不会运行
  10. Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败

示例:

[Unit]

Description=nginx - high performance web server

Documentation=http://nginx.org/en/docs/

After=network.target remote-fs.target nss-lookup.target

[Service]

参数说明:

  1. Type:定义启动时的进程行为。它有以下几种值:
  • Type=simple(默认值)

systemd认为该服务将立即启动,服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型

  • Type=forking

systemd认为当该服务进程fork,且父进程退出后服务启动成功。

对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。

  • Type=oneshot

这一选项适用于只执行一项任务、随后立即退出的服务。

可能需要同时设置 RemainAfterExit=yes,使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。

  • Type=notify

与 Type=simple 相同,但约定服务会在就绪后向systemd发送一个信号,这一通知的实现由 libsystemd-daemon.so 提供

  • Type=dbus

若以此方式启动,当指定的 BusName出现在DBus系统总线上时,systemd认为服务就绪。

  • Type=idle

若有其他任务执行完毕,当前服务才会运行

  1. ExecStart:启动当前服务的命令
  2. ExecStartPre:启动当前服务之前执行的命令
  3. ExecStartPost:启动当前服务之后执行的命令
  4. ExecReload:重启当前服务时执行的命令
  5. ExecStop:停止当前服务时执行的命令
  6. ExecStopPost:停止当前服务之后执行的命令
  7. RestartSec:自动重启当前服务间隔的秒数
  8. KillMode:定义 Systemd 如何停止 sshd 服务。它可以设置的值如下:
  1. control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
  2. process:只杀主进程
  3. mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
  4. none:没有进程会被杀掉,只是执行服务的 stop 命令
  1. Restart:定义了 sshd 退出后,Systemd 的重启方式。它可以设置的值如下:
  1.  - no(默认值):退出后不会重启
  2.  - on-success:只有正常退出时(退出状态码为0),才会重启
  3.  - on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
  4.  - on-abnormal:只有被信号终止和超时,才会重启
  5.  - on-abort:只有在收到没有捕捉到的信号终止时,才会重启
  6.  - on-watchdog:超时退出,才会重启
  7.  - always:不管是什么退出原因,总是重启

对于守护进程,推荐设为on-failure。

对于那些允许发生错误退出的服务,可以设为on-abnormal。

  1. TimeoutSec:定义Systemd停止当前服务之前等待的秒数
  2. Environment:指定环境变量
  3. user字段可以设置服务的用户名
  4. WorkingDirectory字段指定服务的安装目录(执行路径)

示例:

[Service]

Type=forking

PIDFile=/usr/local/nginx/logs/nginx.pid

ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

[Install]

参数说明:

  1. WantedBy:它的值是一个或多个 Target。

Target的含义是服务组,表示一组服务。

当前Unit激活时(enable),符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中。

  1. RequiredBy:它的值是一个或多个Target。

当前Unit激活时,符号链接会放入/etc/systemd/system目录下面以Target 名 + .required后缀构成的子目录中

  1. Alias:当前Unit可用于启动的别名
  2. Also:当前Unit激活(enable)时,会被同时激活的其他Unit。

[Install]

WantedBy=multi-user.target

Target

启动计算机的时候,需要启动大量的 Unit如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。

Systemd 的解决方案就是 Target

简单说,Target就是一个 Unit 组,包含许多相关的Unit。

启动某个 Target 的时候,Systemd就会启动里面所有的Unit。

从这个意义上说,Target 这个概念类似于"状态点"。启动某个 Target 就好比启动到某种状态

传统的init启动模式里面,有 RunLevel 的概念,跟Target的作用很类似。

不同的是,RunLevel是互斥的。不可能多个RunLevel同时启动,但是多个Target可以同时启动。

常用命令使用(示例)

    1. 自启动

        systemctl enable nginx.service

     2. 禁止自启动

         systemctl disable nginx.service

     3. 启动服务

         systemctl start nginx.service

     4. 停止服务

         systemctl stop nginx.service

     5. 重启服务

         systemctl restart nginx.service

     6. 查看Unit定义文件

         systemctl cat nginx.service

     7. 编辑Unit定义文件

         systemctl edit nginx.service

     8. 重新加载Unit定义文件

         systemctl reload nginx.service

     9.  列出已启动的所有unit,就是已经被加载到内存中

         systemctl list-units

     10. 列出系统已经安装的所有unit,包括那些没有被加载到内存中的unit

         systemctl list-unit-files

     11.  查看服务的日志

        journalctl -u nginx.service

        ## 还可以配合`-b`一起使用,只查看自本次系统启动以来的日志

     12. 查看所有target下的unit

          systemctl list-unit-files --type=target

     13. 查看默认target,即默认的运行级别。对应于旧的`runlevel`命令

          systemctl get-default

     14. 设置默认的target

          systemctl set-default multi-user.target

     15. 查看某一target下的unit

          systemctl list-dependencies multi-user.target

     16. 切换target,不属于新target的unit都会被停止

          systemctl isolate multi-user.target

     17. 关机

          systemctl poweroff

     18. 重启

          systemctl reboot

     19. 进入rescue模式

          systemctl rescue

详细过程[示例]

Ref:  systemd - CentOS 7进程守护&监控-CSDN博客

Step1:

vim test_watch.sh

chmod 755 test_watch.sh

 

test_watch.sh

#!/bin/bash

# test_watch.sh

while [ 1 ]

do

    echo `date` >> /root/log.txt

    sleep 1

done

Step2:

假设将可执行脚本,放到/usr/sbin

cd /usr/sbin

ln -sf /root/test_watch.sh sysd-test

Step3:创建服务文件,设置init进程托管

  • systemd服务文件放置目录有系统级和用户级区分:
  1. 系统级(/usr/lib/systemd/system/)
  2. 用户级(/usr/lib/systemd/user/)。
  • 在开机中没有登陆情况下就能运行的程序,应该放置在系统目录中;反之则放在用户目录中

# vim /usr/lib/systemd/system/sysd-test.service

[Unit]

Documentation=no

Description= A test script for watch daemon

After=no

Wants=no

[Service]

EnvironmentFile=no

ExecStart=/usr/sbin/sysd-test

ExecReload=/bin/kill -HUP $MAINPID

##KillMode=process

Restart=on-failure

RestartSec=1s

[Install]

WantedBy=multi-user.target graphic.target  #runlevel:2345

#######  备注:设置  激活开机启动

# systemctl enable sysd-test.service

该语句相当于如下几条语句

# cd /etc/systemd/system/multi-user.target.wants

# ln -sf /usr/lib/systemd/system/sysd-test.service sysd-test.service

# cd /usr/lib/systemd/system/graphical.target.wants/

# ln -sf /usr/lib/systemd/system/sysd-test.service sysd-test.service

#systemctl disable sysd-test.service

########## 验证

### 启动守护进程

# systemctl start sysd-test

### 用ps -ef|grep sysd-test  命令,查看sysd-test进程及进程号,注意观察进程号

###  用kill -9 pid 命令杀死该sysd-test进程

###  再重复操作,查看sysd-test进程号,可以发现进程号已经变更

####彻底停止sysd-test进程   

# systemctl stop sysd-test

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值