当前位置: 首页 > 科技观察

如何使用Systemctl管理服务

时间:2023-03-16 00:17:05 科技观察

本文转载自微信公众号《Linux开发那些事》,作者LinuxThings。转载本文请联系Linux开发那些事儿公众号。systemd是一个服务管理器,已成为Linux发行版中的新标准。它使管理服务器变得更加容易。理解和利用构成systemd的工具将有助于我们更好地理解它提供的便利。systemctl的起源是在centos7之前用service来管理服务。虽然使用起来比较简单,但是对于每一个服务,我们都需要手动编写脚本来控制服务的启动、停止、重启等。完全取决于写剧本的人,有的剧本会很长,有很多情况需要自己处理。例如,/etc/init.d/network是一个管理网络服务的脚本。它有250行,脚本中的逻辑处理相当不错。复杂为了解决上述问题,在centos7中引入了systemctl服务管理工具,使用固定格式的脚本来控制服务的启停。因此,引入systemctl后,服务管理变得非常简单,服务的启动、停止、重启只需要一条命令。下面介绍如何使用systemctl管理服务的启动。对于支持systemd的软件,安装时会自动在/usr/lib/systemd/system目录下添加一个配置文件。下面以mysql为例,说明开机后如何设置systemctlenablemysqld。执行以上命令后,在/etc/systemd/system/multi-user.target.wants目录下添加一个符号链接。这个链接指向/usr/lib/systemd/system/下的mysqld.service文件设置启动后,/etc/systemd/system/目录下的文件要等到下次开机才会自动执行。如果忘记某个服务是否设置为开机启动,可以使用systemctlis-enabled服务名查看[root@ecs-centos-7~]#systemctlis-enabledmysqlenabledstartservice执行systemctlstart服务名即可启动该服务,下面以mysql为例来说明systemctlstartmysqld服务启动后,可以执行systemctlstatus服务名查看服务是否启动成功[root@ecs-centos-7~]#systemctlstatusmysqldmysqld.service-MySQLServerLoaded:loaded(/usr/lib/systemd/system/mysqld.service;启用ed;vendorpreset:disabled)Active:active(running)since52020-12-0421:51:53CST;3months9daysagoDocs:man:mysqld(8)http://dev.mysql.com/doc/refman/en/using-systemd.htmlMainPID:1053(mysqld)CGroup:/system.slice/mysqld.service└─1053/usr/sbin/mysqld--daemonize--pid-file=/var/run/mysqld/mysqld.pidDec0421:51:51ecs-centos-7.4-64bit-20200212systemd[1]:StartingMySQLServer...12月0421:51:53ecs-centos-7.4-64bit-20200212systemd[1]:StartedMySQLServer。上面结果中各个字段的含义Loaded:配置文件Location,这里是/usr/lib/systemd/system/mysqld.serviceActive:状态,active(运行)表示启动,如果inactive(死)表示关闭Docs:服务器文件MainPID:主进程IDCGroup:进程组中的所有子进程除了使用systemctlstatus服务名外,进程还可以使用如下命令查看服务状态[root@ecs-centos-7~]#systemctlis-activemysqldactive[root@ecs-centos-7~]#systemctlstopmysqld[root@ecs-centos-7~]#systemctlis-activemysqldinactive上面的例子中,mysql是一开始就启动的,所以执行systemctlis-activemysqld命令显示active,说明mysql处于开启状态。关闭mysql服务后,执行systemctlis-activemysqld命令显示inactive,表示mysql关闭。停止服务。要停止正在运行的服务,请执行systemctl停止服务名命令systemctlstopmysqld如果想直接重启服务,执行systemctlrestart服务名命令systemctlrestartmysqld服务配置文件查看mysqld的状态,其配置文件位于/usr/lib/systemd/system/mysqld.service,其他的服务配置文件也位于这个目录下,只是具体的文件名不同而已。该服务根据其配置启动和停止。我们使用编辑器或者使用systemctlcat服务名来查看服务配置文件。下面我们使用sshd服务配置文件来说明[root@ecs-centos-7~]#systemctlcatsshd#/usr/lib/systemd/system/sshd.service[Unit]Description=OpenSSHserverdaemonDocumentation=man:sshd(8)man:sshd_config(5)After=network.targetsshd-keygen.serviceWants=sshd-keygen.service[Service]Type=notifyEnvironmentFile=/etc/sysconfig/sshdExecStart=/usr/sbin/sshd-D$OPTIONSExecReload=/bin/kill-HUP$MAINPIDKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.target配置文件字段描述Unit:启动顺序单元的依赖关系Description:服务描述,描述服务的一段Documentation:serviceAfter:当前服务在指定服务之后启动,即sshd服务需要在network和sshd-keygen服务启动后启动。如果需要在启动指定服务之前启动sshd服务,使用Before字段Wants:Servicedependency,这种依赖是weakDependency,这里指的是sshd和sshd-keygen之间存在依赖,但是有它们之间的依赖性很弱,也就是说,如果sshd-keygen无法启动如果失败,则不会影响sshd。如果要表示强依赖关闭,使用Requires字段,即如果sshd-keygen启动失败或退出,sshd也必须退出Service:服务启动命令和启动参数Type:启动类型,常用值有如下-简单默认值,ExecStart字段启动的进程为主进程-forkingExecStart字段会被fork()启动,此时父进程退出,子进程成为主进程-notify是和simple类似,启动完成后会发送一个通知信号,然后Systemd会启动其他服务。EnvironmentFile:服务的环境变量文件。当前配置文件可以使用$KEY来引用环境变量文件中的参数。上面例子中,sshd的环境变量文件是/etc/sysconfig/sshdExecStart:启动服务时执行的命令ExecReload:重启服务时执行的命令KillMode:如何停止服务,可能的值有-control-group默认值,当前控制组中的所有进程都会被杀死-processonly杀死主进程——混合主进程会收到SIGTERM信号,子进程会收到SIGKILL信号——不会杀死任何进程,只需执行服务的停止命令即可重启:服务在任何原因退出后都会重启,可能的值有:-always不管服务退出什么,总是重启-on-success退出时normally-on-failure当它非常正常地退出时-on-abnormal当它被信号终止并超时时重新启动-on-abort只有当它没有收到信号时才重新启动-on-watchdog超时退出,并且然后重启我在大多数情况下,将其设置为on-failure。RestartSec:服务器重启前等待多少秒Install:如何安装配置文件,即定义如何确保启动时的WantedBy字段表示服务所在的Target。这里的Target可以理解为一组服务。WantedBy的值是一个或多个目标。当前Unit(单元)激活(enable)时,符号链接会放在/etc/systemd/系统目录下,在Target名称+.wants后缀组成的子目录中例如:WantedBy字段的值sshd的是multi-user.target,执行systemctlenablesshd之后相当于执行了ln-s/usr/lib/systemd/system/sshd.service/etc/systemd/system/multi-user.target.wants/sshd.service对应的命令,当执行systemctldisablesshd命令后会去掉上图中两个目录之间的符号链接,也就是说开机后不会启动sshd服务。上图中配置文件名sshd.service的后缀.service表示Unit的类型。如果省略,默认后缀是.service,所以sshd会被当成sshd.service重新加载配置。如果修改了服务的配置文件,需要重新加载配置文件并重启服务[root@ecs-centos-7~]#systemctldaemon-reload[root@ecs-centos-7~]#systemctlrestartmysqldRescueModeWhen系统无法正常启动,您可以将系统设置为RescueModeRescueMode提供单一用户界面来修复系统问题。执行systemctlrescue命令进入救援模式[root@cghost21~]#systemctlrescuePolicyKitdaemondisconnectedfromthebus.Wearelongeraregisteredauthenticationagent.Broadcastmessagefromroot@cghost21onpts/1(Tue2021-03-1020:47:51CST):接受当前登录用户后将进入rescue模式!以下示例显示了系统将进入救援模式的通知。上面root用户执行systemctlrescue命令,test用户收到系统如下广播通知[test@cghost21~]$Broadcastmessagefromroot@cghost21onpts/1(Tue2021-03-1020:47:51CST):Thesystemisgoing现在进入救援模式!