# 系统管理篇(3)- 进程管理
# 一、进程监控
# 1. 进程查看
进程概念
- 运行中的程序,从程序开始运行到终止的整个生命周期是可管理的
- 终⽌的⽅式并不唯⼀,分为正常终⽌和异常终⽌
- 正常终⽌也分为从 main 返回、调⽤ exit 等⽅式
- 异常终⽌分为调⽤ abort、接收信号等
进程查看命令
-
ps
ps # 当前终端中的进程,PID 为进程的唯一标识
ps -e | more # 所有进程,centos7 的 1 号进程是 systemd,而 centos6 为 init
ps -ef | more # UID 为进程的有效用户 id(不一定是创建者),PPID 为父进程的 PID
ps -eLf | more # LWP 线程
当计算机资源不足时,可以查看是否是进程过多或线程过多导致的。
-
pstree
# 默认没有安装,需要先安装yum install -y psmisc
pstree | more
-
top
top# up 33min - 上次开机后已经运行时间# load average: 0.04 0.05 0.06 - 1,5,15 分钟平均负载,可以把负载 1 想象成一个塞满的车道# Tasks - 运行的进程# % Cpu (s) - us 用户态,sy 系统态(进程间状态交互),id 空闲态,wa 等待磁盘操作。按数字 1 可以分别看逻辑 cpu# KiB Mem - 内存使用情况# KiB Swap - swap 使用情况top -p PID
-
总结:进程也是树形结构;进程和权限有着密不可分的关系
# 2. 内存查看
常用命令介绍
-
free
free -m
free -mh
-
top
toptop -p PID
# 二、进程控制
# 1. 进程优先级
-
nice
- 范围从 - 20 到 19,值越小优先级越高,抢占资源就越多
# 运行提供的脚本nice -n 10 ./loop.sh
-
renice
- 重新设置优先级
renice -n 15 PID
# 2. 进程的作业控制
-
& 符号
# 后台运行提供的脚本./loop.sh & -
jobs
jobs# 切换后台进程到前台fg [JOB_ID] # JOB_ID 为 jobs 命令查看到的作业 id
# 切换前台进程到后台,在内存中挂起ctrl + z
# 恢复前台执行jobsfg [JOB_ID]
# 恢复后台执行jobsbg [JOB_ID]
# 3. 进程间通信
- 信号是进程间通信⽅式之⼀,典型⽤法是:终端⽤户输⼊中断命令,通过信号机制 停⽌⼀个程序的运⾏。
- 使⽤信号的常⽤快捷键和命令
- kill -l
- SIGINT 通知前台进程组终⽌进程 ctrl + c
- SIGKILL ⽴即结束程序,不能被阻塞和处理 kill -9 pid
# 三、系统日志
# 1. 守护进程
-
使⽤ nohup 与 & 符号配合运⾏⼀个命令
-
nohup 命令使进程忽略 hangup(挂起)信号,即关掉终端也不会结束进程
nohup tail -f /var/log/messages &
-
-
守护进程 (daemon) 和⼀般进程
- 随 Linux 开机自动启动
- 无需终端启动
- 只占用根目录
- 日志输出到系统日志中
cd /proc/PIDls -l CWD
ls -l FD
# 2. 系统日志
- 常见的系统日志
- /var/log
- message
- cron
- secure
# 四、服务管理程序
# 1. 服务基本概念
服务(提供常⻅功能的守护进程)集中管理⼯具
# 2. service
- 启动脚本位置
/etc/init.d/
# 3. systemctl
-
systemctl 常⻅操作
-
systemctl start | stop | restart | reload | enable | disable 服务名称
-
软件包安装的服务单元 /usr/lib/systemd/system/
-
systemctl 的服务配置
位置
/usr/lib/systemd/system/ -
案例:loop 脚本开机自动启动
cd /usr/lib/systemd/system/vi loopd.service # 通常可以复制 sshd.service 修改
[Unit]
Description=Loop service
After=network.target
[Service]
Type=simple # Daemon 进程使用 forking
User=root
WorkingDirectory=/root
ExecStart=/bin/bash /root/loop.sh
ExecStop=/usr/bin/kill -s QUIT $MAINPID
ExecReload=/usr/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
systemctl start loopd
systemctl stop loopd
systemctl enable loopd -