已复制
全屏展示
复制代码

linux服务与进程systemd自定义


· 10 min read

一. 进程和程序

进程

进程是程序在一个数据集合上的一次动态执行过程,是动态的概念。

进程状态

运行中、睡眠、已停止、僵停

父进程(PPID)与子进程(PID)

父进程复制自己的地址空间来创建一个新的进程结构,叫做子进程,父进程终止后子进程会自然终止。如果父进程终止,而子进程未终止,该子进程叫做孤儿进程。如果子进程终止后,父进程未终止,则该父进程成为僵死进程。

程序

程序是计算机指令的集合,作为软件资源长期存在,是静态的概念。

程序的组成
  • 已分配的内存地址空间
  • 安全属性: 所有权凭据和特权
  • 进程的执行状态

二. 进程查看

pstree

pstree全称process status tree以树状的形式表现进程的父子关系。

  • pstree -c  不使用精简标识法
  • pstree -p  显示进程号
  • pstree -u  显示用户名称

ps

全称process status,显示系统中进程的信息。ps命令显示执行ps命令时刻的那些进程的信息。

  • a  显示所有包括所有终端的进程
  • u  显示进程所有者的信息(占用cpu、内存等)
  • x  显示没有控制终端的进程(如守护进程)
  • -e  显示所有进程
  • -l  以长列表的方式显示
  • -f  显示进程的父进程
  • ps aux     显示的个字段说明:
USER          进程拥有者
PID           进程pid
%CPU          cpu使用率
%MEM          内存使用率
VSZ           占用的虚拟内存大小
RSS           占用的内存大小
TTY           终端的次设备号
STAT          进程的状态,见一下说明
START         进程开始时间
TIME          执行的时间
COMMAND       执行的命令
  • STAT各种状态:
    R:可执行状态,存在于可执行队列中,cpu从此队列选择进程运行
    D:不可中断的睡眠状态,不会响应传递的信号,因为内核的某些处理是不能被打断的,仅在特定的条件下使用
    S:可中断的睡眠状态,正在等待某一条件,被放入对应的等待队列中,当条件满足时被唤醒
    T:暂停状态,进程已被停止
    Z:僵尸状态,子进程在退出时向父进程发出信号,子进程除pid之外的资源都已经释放,这样的子进程叫僵尸进程
    W:没有足够的内存分页可分配
    <: 高优先级的进程
    N:低优先级的进程
    L:有内存分页分配并锁在内存内

top

显示当前系统正在执行的进程的相关信息。对系统处理器实时的状态进行监控。

top - 03:55:19 up 11:48,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 430 total,   1 running, 429 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   1003392 total,   578796 used,   424596 free,     2080 buffers
KiB Swap:  2113532 total,        0 used,  2113532 free.   202168 cached Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM TIME+ COMMAND                                                         
  5700 root      20   0  123900   1844   1100 R   0.3  0.2   0:07.83 top                                                             
   269 root      20   0       0      0      0 S   0.2  0.0   0:00.44 ksoftirqd/1                                                     
  3516 root      20   0  133596   4840   3664 S   0.2  0.5   0:02.63 sshd                                                            
  5587 root      20   0       0      0      0 S   0.2  0.0   0:01.82 kworker/0:0                                                     
  5735 root      20   0       0      0      0 S   0.2  0.0   0:00.06 kworker/1:2
执行参数

-p PID  指定要监控进程的pid
-i   不显示任何闲置或者僵死的进程
-d 4  指定刷新屏幕的时间,单位是秒。可以使用s来交互式的改变刷新的时间间隔。

使用 top 命令后的前五行内容的详细解释
  • 第一行:当前时间、系统运行时间、登录用户数(打开的终端数)、系统1min、5min、15min的平均负载
  • 第二行:进程总数、正在运行数、睡眠进程数、停止进程数、僵死进程数
  • 第三行:
    1、用户空间占用CPU百分比
    2、内核空间占用CPU百分比
    3、用户空间内改变过优先级的进程占用CPU百分比
    4、空闲CPU百分比
    5、等待I/OCPU时间百分比
    6、硬中断(Hardware Interrupts)占用CPU百分比
    7、软中断(Software Interrupts)占用CPU百分比
    8、steal time ,虚拟服务占用的CPU时间时间百分比
  • 第四行:物理内存中来、使用的物理内存总量、空闲内存总量、用作内核缓存的内存总量
  • 第五行:交换区总量、使用的交换去总量、空闲的交换区总量、缓冲的交换区总量
对各进程信息的状态监控说明:
PR:       进程优先级
NI:       `nice`值,负值表示高优先级,正值表示优先级低
VIRT:     进程使用虚拟内存总量,默认单位是`KB`。`VIRT=SWAP + RES`
RES:      进程使用的、未被换出的物理内存大小,默认单位是KB。`RES= CODE + DATA`
SHR:      共享内存大小,默认单位是`KB`
S:        进程状态(`DRSTZ`)
TIME+:    进程使用的`CPU`时间总计,单位是`1/100`秒
top的交互命令:

c     在命令名称和完整的命令行之间切换显示
i     忽略闲置和僵死的进程(再按一次还原)
k     终止某个进程,输入进程的pid,如不能正常结束,则使用9信号强制结束,默认是               15
M     根据驻留内存大小进行排序
P     根据cpu使用百分比大小进行排序
s     改变两次刷新的时间,如果输入0则表示不断刷新。

pgrep

  • pgrep -l keyword
    查询进程带有此关键字的进程,并显示出这些进程的pid。等价于 pstree -p | grep keyword
  • pgrep -u username
    查询此用户的进程,并显示这些进程的pid,然后你可以通过此pid使用 top -p pid 查看这个进程的情况

三. 进程操作

关闭进程

kill   进程号            # 杀死进程,默认信号是15
kill   -9  pid          # 强行关闭
kill   -1  pid          # 重启进程,相当于restart

xkill                   # 关闭某个图形程序,等于在windows下的某个窗口无法响应,就需要用此命令

killall  进程名          # 杀掉所有同名进程
killall  -term  httpd   # 向进程发送指定信号
killall   -9   bash     # 把所有的登录后的shell都杀掉,需要重新连接。

pkill  httpd            # 通过程序的名字,直接杀死所有进程

前台进程和后台进程

  • 运行程序时在末尾添加 & 符号,则可进入后台进程,在后台运行的程序不用担心被ctrl+c来终止该程序。
  • ctrl+z      在一个前台进程运行时, 可以暂停该进程,并放入后台。
  • jobs -l    可以查看后台进程
  • fg pid      可以将该程序在前台运行
  • bg pid     可以将暂停的程序继续在后台运行

四. 守护进程

守护进程的概念

守护进程是生存期很长的一种后台进程。它们独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件,它不存在任何存在的父进程。它们常常伴随着Linux系统启动时启动,关闭时关闭。大多数服务器都是用守护进程实现的。有时将也将其称作服务,但是严格来讲,服务是静态的概念,守护进程是动态的。

systemdrhel7中的系统和服务管理器,是linux启动的第一个进程,pid1rhel6的第一个进程为initpid也为1),相对于rhel6来说,它添加了一些新功能:

  • 并行启动服务,提高了启动的速度。
  • 按需启动守护进程。
  • 对自动服务的依赖有更好的管理,比如网络服务不可用时不启动网络服务。

systemd的unit

  • systemd开启和监督系统是基于unit的。它是由一个与配置文件对应的名字和类型组成的,包括如下类型。
[root@localhost ~]# systemctl -t help
Available unit types:
Service      # 系统的守护进程,类型有:启动、重启、停止、重载、状态等
Socket       # 套接字,每一个socket unit都有一个相应的服务unit
Target       # 此类unit为其他unit进行逻辑分组,只是引用其他的unit
Device       # 此类unit封装一个存在于Linux设备树中的设备
Mount        # 封装系统结构层次中的一个挂载点
Automount    # 自挂载点,每一个自挂载单元对应一个已挂载的挂载unit
Snapshot     # 与target unit相似,快照本身不做什么,其唯一目的是引用其他unit
Timer
swap
path         # 路径单元,用于在特定文件系统发生变化前延迟服务的启动
slice
scope
  • 所有可用的单元文件存放路径
/usr/lib/systemd/system
/etc/systemd/system         # 优先级更高
  • 使用systemctl命令时的关键字解释
loaded            配置文件被处理
active(running)   一个或多个进程持续运行
active(exited)    成功完成一个“一次性”配置
active(waiting)   运行但是在等待事件
inactive          未运行
enabled           开机自启动
disabled          不开机自启动
static            不能被启用,但可以被已启用单元自启动
  • 查看服务状态
systemctl                         查看所有单元的状态
systemctl   --type=service        查看指定服务单元的状态
systemctl   --failed              仅查看失败的单元
systemctl   is-active   rsyslog   查看是否激活
systemctl   is-enabled  rsyslog   查看是否开机自启动
systemctl   list-units            输出激活的单元
systemctl   list-unit-files        查看所有已安装的服务
  • 单元服务名称说明
    1、如果没有写扩展名,systemctl默认吧扩展名当做.service,例如netcfg等价于netcfg.service
    2、挂载点会自动转化为相应的.mount单元。例如/home等价于home.mount
    3、设备会自动转化为相应的.device单元,所以/dev/sda2等价于dev-sda2.device
  • 单元服务的操作类型有
start
stop
restart
reload
status
enable      # 开机自动激活单元
disable     # 取消开机自动激活单元
help        # 显示单元的手册页
systemctl  daemon-reload            # 表示重新载入systemd,扫描新的或有变动的单元
systemctl  mask  name.service       # 屏蔽
systemctl  unmask  name.service     # 取消屏蔽
# 系统中安装了相互冲突的服务时,需要屏蔽某些服务(屏蔽之后无法手动或自动启动),比如 iptables 和 firewalld,network 和 NetworkManager

五. 自定义systemd服务

准备服务

准备脚本 /tmp/test_service.sh,假设服务名称为 test_service

#!/bin/bash
while true 
do
    date >> /tmp/test_service.log;
    sleep 3;
done

编辑service文件

/etc/systemd/system/test_service.service

[Unit]
Description=custom test services
After=network-online.target

[Service]
Type=simple
User=root
ExecStart=bash /tmp/test_service.sh
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target
WantedBy=graphical.target

启动服务

sudo systemctl daemon-reload
sudo systemctl start test_service.service
sudo systemctl status test_service.service
sudo systemctl enable test_service.service

查看日志文件

$ tail -f /tmp/test_service.log 
Thu Jul 20 19:56:38 CST 2023
Thu Jul 20 19:56:41 CST 2023
Thu Jul 20 19:56:44 CST 2023
Thu Jul 20 19:56:47 CST 2023
Thu Jul 20 19:56:50 CST 2023
Thu Jul 20 19:56:53 CST 2023
Thu Jul 20 19:56:56 CST 2023
Thu Jul 20 19:56:59 CST 2023
Thu Jul 20 19:57:02 CST 2023
Thu Jul 20 19:57:05 CST 2023
🔗

文章推荐