当前位置: 首页 > Linux

使用systemd构建您的服务

时间:2023-04-06 02:06:38 Linux

什么是systemd?Systemd服务是以.service结尾的单元配置文件,它控制由Systemd控制或监视的进程。简单的说就是用来在后台以守护进程的形式运行程序。为什么要用systemdservice文件来写,好用,可以自动保持进程存活(功能强大,可以替代pm2)自动收集进程输出systemd主命令的输出,可以看到systemd以字母d结尾,根据linux的通常规则,可以判断进程是守护进程,可以通过systemctl进行交互。systemctlstartredis.service#启动服务systemctlstopredis.service#停止服务systemctlrestartredis.service#重启服务systemctlenableredis.service#设置redis开机启动写入systemdsystmd服务文件一般放在/etc/systemd/system/文件夹。systemd服务文件结构化,下面列出笔者常用的。[Unit]Description=GitAutoUpdateHookServiceAfter=network.target[Service]Type=simpleExecStart=/root/src/git-hookd/git-hookdRestart=always[Install]WantedBy=multi-user.target拿之之前写过的init.d的脚本对下面#!/bin/bash###BEGININITINFO#Provides:xialeistudio#Required-Start:$network#Required-Stop:$local_fs#Default-Start:2345#Default-Stop:016#Short-Description:testservice#Description:testservice###ENDINITINFOPROG="testd"PROG_PATH="/root/apps/testd"PROG_ARGS="-uxialei"PID_PATH="/var/run/"start(){如果[-e"$PID_PATH/$PROG.pid"];然后回显“错误!$PROG正在运行!”2>&1退出1else$PROG_PATH/$PROG$PROG_ARGS2>&1>"/var/log/$PROG.log"&pid=`psax|greptestd|awk'{print$2}'|head-n1`echo"$PROGstarted"echo$pid>"$PID_PATH/$PROG.pid"fi}stop(){if[-e"$PID_PATH/$PROG.pid"];然后pid=`psax|greptestd|awk'{print$2}'|head-n1`kill$pidrm-rf"$PID_PATH/$PROG.pid"echo"$PROG$pidkilled"elseecho"Error!$PROG未运行!”2>&1exit1fi}if["$(id-u)"!="0"];然后echo"Pleaserunasroot!"2>&1exit1ficase"$1"instart)startexit0;;停止)停止出口0;;重新加载|重新启动)停止开始退出0;;**)echo"Usage:$0{start|stop|reload}"2>&1exit1;;esac可以看出init.d脚本过于原始,systemd将替换init.d指日可待。systemd服务文件说明服务文件由三部分组成:Unit、Service、Install。在所有引导过程中,单元应由systemd控制。文件/设备/程序等称为一个单元Description:服务描述Wants:如果单元启动成功,则启动该字段定义的单元。如果Wants定义的单元启动失败,则该单元不受影响。要求:如果单元启动成功,将启动该字段定义的单元。如果Requires定义的单元启动失败,那么这个单元也失败了。该字段无法控制顺序。如果Requires定义的单元在单元启动之前启动,则它们都无法启动。不建议使用该字段OnFailure:如果单元启动失败,则启动该字段定义的单元Before/After:指定该单元的启动顺序。在这个例子中,你只需要依赖网络单元。Service服务本体定义:TypeStartuptypeExecStartCommand启动服务ExecStopCommand停止服务(一般不写)Restart重启规则RemainAfterExit即使没有进程也认为是服务SuccessfulstartupType启动类型如下:+simple:默认类型,启动的进程会成为服务进程。+分叉:标准Unix守护进程。进程启动后,会通过系统调用fork,建立必要的通信通道后,父进程退出,留下守护进程的子进程。(也就是你自己把进程变成daemon进程)+oneshot:一次性命令。服务运行结束后没有进程,需要配合RemainAfterExit。Restart重启规则如下:+no(默认值):退出后不重启+always:不管什么原因退出,总是重启+on-success:只有在正常退出时(退出状态码为0),会重启+on-failure:异常退出时(退出状态码不为0),包括信号终止和超时,会重启+on-异常:只有信号终止和超时才会重启+on-abort:only它只会在收到未捕获的信号并终止时重新启动+on-watchdog:超时后退出,它会重新启动Installsystemd加载规则定义了谁将加载WantedBy,在本例中使用多用户。链接到/etc/systemd/system/multi-user.target.wants目录Alias服务别名,可以通过systemctl服务别名重启等操作。最后,是时候通过systemd重写init.d服务了,如果有必要,你甚至可以将pm2守护进程交给systemd。