Linux常用命令--进程管理
摘要
-
本文介绍Linux进程管理等相关命令
-
本文基于
CentOS8(x86_64)
ps :查看进程
1 | # 与top命令类似,可以查看进程信息 |
pstree :树状查看进行信息
1 | # 折叠展示,只展示父进程和子进程的数量 |
kill :终止进程
1 | # 正常关闭进程 |
信号量
- 通过
kill -l
可以查看所有信号的编号和名称
信号编号 | 信号名称 | 说明 |
---|---|---|
1 | SIGHUP | 挂起信号,通常用于通知进程终端断开或重新加载配置。 |
2 | SIGINT | 中断信号,通常由用户通过键盘 (Ctrl+C ) 发送,用于中断一个进程。 |
3 | SIGQUIT | 退出信号,通常由键盘 (Ctrl+\ ) 发送,要求进程生成核心转储并退出。 |
4 | SIGILL | 非法指令信号,表示进程执行了非法或未定义的机器指令。 |
5 | SIGTRAP | 陷阱信号,通常用于调试程序(如断点异常)。 |
6 | SIGABRT | 异常终止信号,进程调用 abort() 函数时触发。 |
7 | SIGBUS | 总线错误信号,通常由于未对齐的内存访问引发。 |
8 | SIGFPE | 浮点异常信号,例如除零或溢出。 |
9 | SIGKILL | 强制终止信号,无法被捕获或忽略,立即终止进程。 |
10 | SIGUSR1 | 用户自定义信号 1,用户或应用程序自定义用途。 |
11 | SIGSEGV | 段错误信号,表示进程访问了非法的内存地址。 |
12 | SIGUSR2 | 用户自定义信号 2,用户或应用程序自定义用途。 |
13 | SIGPIPE | 管道破裂信号,通常在写入一个已关闭的管道或套接字时触发。 |
14 | SIGALRM | 定时器信号,由 alarm() 函数触发,用于定时操作。 |
15 | SIGTERM | 终止信号,允许进程执行清理操作后终止。这个也是缺省的信号。 |
16 | SIGSTKFLT | 堆栈错误信号,主要用于硬件相关的堆栈操作(极少使用)。 |
17 | SIGCHLD | 子进程状态改变信号,当子进程退出或停止时触发。 |
18 | SIGCONT | 继续信号,用于恢复被暂停的进程。 |
19 | SIGSTOP | 暂停信号,无法被捕获或忽略,立即暂停进程。 |
20 | SIGTSTP | 终端暂停信号,通常通过键盘 (Ctrl+Z ) 发送。 |
21 | SIGTTIN | 后台进程尝试从终端读取输入时触发。 |
22 | SIGTTOU | 后台进程尝试向终端写入输出时触发。 |
23 | SIGURG | 紧急条件信号,通常用于套接字通信中的紧急数据。 |
24 | SIGXCPU | 超过 CPU 时间限制信号。 |
25 | SIGXFSZ | 超过文件大小限制信号。 |
26 | SIGVTALRM | 虚拟定时器信号,由 setitimer() 触发,用于进程执行时间的计时。 |
27 | SIGPROF | 统计定时器信号,用于程序性能分析。 |
28 | SIGWINCH | 窗口大小改变信号,终端窗口调整时触发。 |
29 | SIGIO | I/O 可用信号,表示文件描述符可用。 |
30 | SIGPWR | 电源故障信号。 |
31 | SIGSYS | 无效的系统调用信号。 |
-
从 SIGRTMIN(34)到 SIGRTMAX(64)的信号是实时信号,供用户或应用程序使用,具有更高的优先级和灵活性。
-
使用时,可以通过数字或名称来指定信号,例如
kill -9
或kill -SIGKILL
,当然也支持去掉SIG
的简称,例如kill -KILL
。 -
咋一看有很多,但实际上我们日常通过键盘能操作的就几个。
-
- SIGHUP:挂起信号,通常用于通知进程终端断开或重新加载配置。
1
2
3
4# 重新加载nginx配置文件
kill -HUP `cat /var/run/nginx.pid`
# 或者
sudo systemctl reload nginx-
- SIGINT:中断信号,通常由用户通过键盘 (
Ctrl+C
) 发送,用于中断一个进程。
- SIGINT:中断信号,通常由用户通过键盘 (
-
- SIGQUIT:退出信号,通常由键盘 (
Ctrl+\
) 发送,要求进程生成核心转储并退出。
- SIGQUIT:退出信号,通常由键盘 (
-
- SIGKILL:强制终止信号,无法被捕获或忽略,立即终止进程。
1
2# 强制终止进程
kill -9 `cat /var/run/nginx.pid`-
- SIGTERM:用于优雅的终止进程,通常由用户或应用程序发送,用于通知进程进行清理操作。这个也是缺省的信号。
1
2
3
4# 终止进程
kill -TERM `cat /var/run/nginx.pid`
# 或者
kill `cat /var/run/nginx.pid` -
进程的挂起和恢复
1 | ctrl+c :终止 |
进程运行优先级
-
进程优先级是 PRI(top中的PR),其表示程序被 CPU 执行的先后顺序,此值越小进程的优先级别越高
-
PRI 值不是 Nice 值,但是 Nice 值会影响优先级,
PRI(new) = PRI(old) + nice
,所以我们调整 Nice 值,就可以改变进程的优先级 -
linux下的进程调度优先级 Nice 是从 -20 到 19 ,一共 40 个级别,数字越大,表示进程的优先级越低。默认时候,进程的调度优先级是0。
1 | # 指定命令的运行优先级 |
at :执行一次的计划任务
-
/var/spool/at:at任务存放在该目录下
1 | # 启动at服务 |
-
用户限制:
/etc/at.allow
:如果文件存在,则只有此文件中列出的用户可以使用at命令
/etc/at.deny
:如果文件存在,则此文件中列出的用户不可以使用at命令
如果以上两个文件都不存在,则只有root用户可以使用at命令
如果以上两个文件都存在,但是都为空,则所有用户都可以使用at命令
crontab :周期性计划任务
-
systemctl start crond
:启动cron服务,默认启动 -
crontab -l
:显示当前用户下的计划任务 -
crontab -e
:编辑当前用户下的计划任务 -
/var/spool/cron
:计划任务保存在该路径下 -
/etc/cron.allow
与/etc/cron.deny
:用户限制,规则同at
-
格式:
分钟[0~59] 小时[0~23] 日期[1~31] 月份[1~12] 星期[0~6] commands
1 | # 每5分钟执行一次 |
systemctl :服务管理
-
centOS7以后使用
systemd
进行服务管理,其命令接口为systemctl
-
systemctl
兼容了service
,即systemctl
也会去/etc/init.d
目录下,查看、执行相关程序 -
如下centOS6及之前的服务启动方式,centOS7及之后仍然可以通过这种方式管理服务,实际上会重定向到systemctl命令
1 | service redis start |
-
systemd
的服务配置放在目录/usr/lib/systemd/system (Centos)
或/etc/systemd/system (Ubuntu)
-
配置目录下有多种类型文件
.mount
,.service
,.target
,.socket
,.timer
等等- 不同的文件类型代表不同的资源,统称为 Unit(单位),Unit 一共分成12种类型
1
2
3
4
5
6
7
8
9
10
11
12Service unit:系统服务
Target unit:多个 Unit 构成的一个组
Device Unit:硬件设备
Mount Unit:文件系统的挂载点
Automount Unit:自动挂载点
Path Unit:文件或路径
Scope Unit:不是由 Systemd 启动的外部进程
Slice Unit:进程组
Snapshot Unit:Systemd 快照,可以切回某个快照
Socket Unit:进程间通信的 socket
Swap Unit:swap 文件
Timer Unit:定时器- 重点学习
.service
文件,其定义了一个服务,分为[Unit],[Service],[Install]三个小节
1
2
3
4
5
6
7
8
9
10
11[Unit]
Description:描述,
After:在哪些服务启动后才启动
ConditionPathExists: 执行条件
[Service]
EnvironmentFile:变量所在文件
ExecStart: 执行启动脚本
Restart: fail时重启
[Install]
Alias:服务别名
WangtedBy: 多用户模式下需要的 -
查看服务
1 | # 列出当前已经加载启动的 unit,如果添加 -all 选项会同时列出没有启动的 unit |
-
service :系统服务
1 | # 启动redis服务 |
小贴士
1 | # 查看系统启动耗时 |
-
target :类似于运行级别,支持多个target同时启动。target其实是多个unit的组合,系统启动说白了就是启动多个unit
1 |
|
小贴士
- 1.
systemd
主配置文件/etc/systemd/system.conf
- 2.开机会先加载
/etc/systemd/system/default.target
- 3.所有的
service
和target
都在/usr/lib/systemd/system/
目录下 - 4.
/etc/systemd/system/defaut.target
是一个软连接,软连接到了/usr/lib/systemd/system/multi-user.target
,它会加载/usr/lib/systemd/system/multi-user.target.wants
下面的service
- 5.查看一个
service
属于哪个target
,需要查看具体的service文件,如:cat /usr/lib/systemd/system/sshd.service
,看里面[install]
部分
chkconfig :设置系统服务在哪些运行级别下开机启动
-
centOS7之后不再使用这种方式,而是使用
systemctl
,但是仍然可以在/etc/init.d
目录下创建管理脚本,然后通过chkconfig
进行管理
1 | chkconfig --list :查看全部系统服务的运行级别 |
ntsysv :通过界面设置服务是否开机启动
-
centOS7之后不再使用这种方式,而是使用
systemctl
,但是仍然可以使用其管理当前运行级别下的服务 -
运行命令后会弹出设置界面,服务前面有*号的表示开机启动,使用空格修改,Tab键进行跳转
1 | # 修改当前的运行级别下的服务 |
Linux运行级别
0:系统关机模式,系统默认运行级别不能设置为0,否则无法正常启动系统
1:单用户模式,也称为救援模式,root权限,用于系统维护,禁止远程登陆,类似Windows下的安全模式登录。
2:无网络支持的多用户模式
3:有网络支持的多用户模式(文本模式,工作中最常使用的模式)
4:保留,未使用
5:有网络支持的图形化模式,支持多用户模式,登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。
6:重启模式,重新引导系统,即重启
运行级别切换
1 | # 查看当前的运行级别,输出结果为: 上一次运行级别 当前运行级别 |
fuser :可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息
-
fuser通常被用在诊断系统的
resource busy
问题,通常是在你希望umount
指定的挂载点得时候遇到
1 | # 查看哪个进程在访问/mnt目录 |
查看进程启动时的环境变量
-
所有启动的进程都会在
/proc/
下创建以其进程IP命名的文件夹,其下为与当前进程相关为文件,其中environ
中的没人就是进程启动时的环境变量,比如我们查看elasticsearch
的进程
1 | $ pgrep -f elasticsearch |