linux(七)linux的服务管理

2023年 10月 11日 35.1k 0

接下来,我们来看一下linux系统中的进程与服务。

那么何为进程,何为服务呢?

在计算机中,一个正在执行的程序或命令,被叫做“进程”(process)

启动之后一直存在、常驻内存的进程,一般称之为“服务”(service)

 

Linux中服务管理一般有两个命令,serveice、systemctl。

 

一:service服务管理

这个是centos6以及之前的版本使用的服务管理。目前了解即可。

 

service命令其实是去/etc/init.d目录下,去执行相关程序,init.d目录包含许多系统各种服务的启动和停止脚本。当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。

 

1:语法

service 服务名称 start | stop | status | restart

下面我们来测试一下:重启ubuntu虚拟机中的nginx

sudo service nginx restart

如下图所示:

1.png

 

2:查看service的服务

在终端中执行:

ll /etc/init.d/

如下图所示:

2.png

这样就列出了,目前在系统服务中的所有软件。挑了几个我们认识的。Cron:定时任务、nginx:web服务器、ssh:远程链接、vaware-tools:虚拟机屏幕自适应。

 

二:systemctl 服务管理

这个命令,是centos7及以后的版本在使用的系统服务管理命令,当然,这并不代表service这个命令就不能用了。但是更推荐使用systemctl

1:命令格式

systemctl start | stop | status | restart | disable | enable | show | kill | reload 服务名

 

2:测试一下

我们来看一下nginx服务的状态:

systemctl status nginx

如下图所示:

3.png

3:查看systemctl服务进程

Systemctl服务的文件都放在/usr/lib/systemd/system(/lib/systemd/system)(/etc/systemd/system)目录下,执行

ll /usr/lib/systemd/system

如下图所示:

4.png

 

通过对比,我们可以发现,目前主要的服务还都是在systemctl服务下的,通过总用量对比即可发现。

 

4:手动添加systemctl 服务。

为什么要手动添加systemctl服务呢?正常来说,nginx是使用yum或者apt-get来安装的。这种安装方式会将服务自动波添加至systemctl。但是,我要是编译安装的nginx,我就需要手动将nginx添加到systemctl中才可以使用systemctl命令来启动nginx。

 

那么如何手动将编译的nginx添加至systemctl呢?

 

我们先去systemctl目录找到nginx的系统服务文件,直接手写可能是要求有点高,照着改一份不就完了嘛。

nginx.service:

[Unit]
# 服务的简单描述
Description=A high performance web server and a reverse proxy server
# 服务文档
Documentation=man:nginx(8)
# Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
After=network.target
 
[Service]
# 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: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
Type=forking
# pid文件路径
PIDFile=/run/nginx.pid
 
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
# 指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
# 指定单元停止时执行的命令或者脚本。
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
# 指定单元停止时执行的命令或者脚本。
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
#
TimeoutStopSec=5
#
KillMode=mixed
 
[Install]
# WantedBy字段:表示该服务所在的 Target。
WantedBy=multi-user.target

 

以上大概是nginx.service的文件内容,以及相关字段的注解。

 

下边我们自己来尝试一下,创建一个test.sh文件,然后为test.sh文件注册一个系统服务。

test.sh

#!/bin/bash
echo "i love u" > /home/camellia/a.txt

 

testsh.service

[Unit]
Description=test.sh Service
 
[Service]
Type=forking
User=camellia
ExecStart=/home/camellia/test.sh
 
[Install]
WantedBy=multi-user.target

 

然后执行重载systemctl服务文件命令:

sudo systemctl daemon-reload

 

然后再执行:

systemctl start testsh.service

 

我们打开/home/camellia/a.txt文件,如下图所示:

5.png

 

5:一些常用的systemctl命令

(1):系统命令

重启系统

sudo systemctl reboot

 

关闭系统,切断电源

sudo systemctl poweroff

 

CPU停止工作

sudo systemctl halt

 

暂停系统

sudo systemctl suspend

 

让系统进入冬眠状态

sudo systemctl hibernate

 

让系统进入交互式休眠状态

sudo systemctl hybrid-sleep

 

启动进入救援状态(单用户状态)

sudo systemctl rescue

 

设置主机名。

sudo hostnamectl set-hostname rhel7

 

显示当前主机的信息

hostnamectl

 

设置主机名。

sudo hostnamectl set-hostname rhel7

 

查看当前运行的所有服务:

systemctl list-units

 

查看服务是否开机启动:

systemctl list-unit-files

这个命令比较有意思,详细说一下。在系统中执行这个命令,如下图所示:

6.png

State表示服务当前的启动状态,vendor preset表示服务默认的启动状态(是否开机自启)

其中Enabled表明服务正在运行;Disabled表明服务当前没有运行;Masked表示服务不会被运行,除非我们手动移除这个标志;Static表示服务只有在别的服务或单元需要它时才被使用。

 

主要是,我们可以使用这个命令来管理服务器上边自启的软件。这个很重要

(2):服务命令

立即启动一个服务

sudo systemctl start nginx

 

立即停止一个服务

sudo systemctl stop nginx

 

重启一个服务

sudo systemctl restart nginx

 

设置开机自启动

systemctl enable nginx

 

停止开机自启动

systemctl disable nginx

 

杀死一个服务的所有子进程

sudo systemctl kill nginx

 

重新加载一个服务的配置文件

sudo systemctl reload nginx

 

重载所有修改过的配置文件

sudo systemctl daemon-reload

 

显示某个 Unit 的所有底层参数

systemctl show nginx

 

显示某个 Unit 的指定属性的值

systemctl show -p CPUShares nginx

 

设置某个 Unit 的指定属性

sudo systemctl set-property nginx CPUShares=500

 

查看某个服务的运行状态:

systemctl status nginx

active(running) : 表示程序正在执行

atcive(exited):执行一次就正常退出的服务,不在系统中执行任何程序

active(waiting):正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行

inactive (dead):未启动状态

**
**

(3):配置文件状态

列出所有配置文件

systemctl list-unit-files

 

列出指定类型的配置文件

systemctl list-unit-files --type=service

 

有好的建议,请在下方输入你的评论。

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论