linux服务与进程systemd自定义
一. 进程和程序
进程
进程是程序在一个数据集合上的一次动态执行过程,是动态的概念。
进程状态
运行中、睡眠、已停止、僵停
父进程(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/O
的CPU
时间百分比
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信号强制结束,默认是 15M
根据驻留内存大小进行排序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系统启动时启动,关闭时关闭。大多数服务器都是用守护进程实现的。有时将也将其称作服务,但是严格来讲,服务是静态的概念,守护进程是动态的。
systemd
是rhel7
中的系统和服务管理器,是linux
启动的第一个进程,pid
为1
(rhel6
的第一个进程为init
,pid
也为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、如果没有写扩展名,systemct
l默认吧扩展名当做.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