1.进程管理


2.进程常用的工具
工具名 |
用途 |
最终 |
ps |
查看当前进程信息 |
进程管理 |
top |
动态查看进程信息 |
进程管理 |
jobs |
查看后台进程 |
进程管理 |
pstree |
进程快照以树形结构显示 |
进程管理 |
pgrep |
进程过滤 |
进程管理 |
strace |
跟踪进程调用 |
进程管理 |
ltrace |
跟踪进程调用 |
进程管理 |
2.1 ps(静态查看)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| PID: 进程的id号 TTY: 进程登录的客户端 TIME: 进程的执行时间(上面是00是因为ps是一个静态工具,查看的是一瞬间的TIME) CMD: 命令 VSZ: 虚拟内存占用量 RSS: 真实内存占用量 STAT: 状态 START: 开始时间 COMMAND:命令(将呈现命令或者文件路径)
[root@192 ~]# ps PID TTY TIME CMD 4975 pts/0 00:00:00 bash 5089 pts/0 00:00:00 ps [root@192 ~]# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2 0.1 0.0 0 0 ? S 02:20 0:00 [kthreadd]
-a: 显示所有用户的进程,而不仅仅是当前用户的。 -u: 显示详细的用户/拥有者(user)信息。 -x: 显示没有控制终端的进程。
|

2.2 top (动态查看)
数据会实时变动
选项 |
功能 |
-d 秒数 |
指定top命令每隔几秒(默认3秒) |
-i |
使top不显示任何限制或者僵死进程 |
-p |
通过指定监控进程PID来仅 |

参数 |
代表含义 |
PR |
优先级:0-20 |
NI(nice值) |
优先级:-20-19 |
VIRT |
虚拟内存 |
S |
状态 |
TIME+ |
程序运行时间 |
交互功能:
操作 |
功能 |
P |
以CPU使用率排序,默认就是此项 |
M |
以内存的使用率排序 |
N |
以PID排序 |
q |
退出top |
c |
切换命令显示模式(完整路径/简短命令名) |
2.3 jobs(查看后台进程)
1 2 3 4 5 6 7 8 9 10 11
| [root@192 home]# vim demo.sh (这里wq退出) [root@192 home]# jobs (然后jobs显示没有后台进程) [root@192 home]# vim demo.sh (这里ctrl+z直接退出)
[1]+ 已停止 vim demo.sh (显示该进程停止,存在后台) [root@192 home]# jobs [1]+ 已停止 vim demo.sh (这里jobs显示有后台进程) [root@192 home]# fg 1 (使用fg命令恢复进程,1指的是 “[1]+” 中的编号1 ) vim demo.sh [root@192 home]# jobs (然后上一步恢复后wq退出后再查看) [root@192 home]# (进程就没有了)
|
2.4 pstree (进程快照以树形结构显示)
基本语法
pstree [选项] ,可以更加直观的来看进程信息
常用选项
-p :显示进程的PID
-u :显示进程的所属用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| [root@192 home]# pstree 4635 systemctl───less
[root@192 ~]# pstree root systemd─┬─NetworkManager─┬─dhclient │ └─3*[{NetworkManager}] ├─agetty ├─atd ├─auditd───{auditd} ├─chronyd ├─crond ├─dbus-daemon ├─firewalld───{firewalld} ├─irqbalance───{irqbalance} ├─lsmd ├─mdadm ├─polkitd───3*[{polkitd}] ├─restorecond ├─rngd───2*[{rngd}] ├─rpcbind ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd───sshd───bash─┬─pstree │ └─vim───{vim} ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─tuned───3*[{tuned}]
|
2.5 pgrep (进程过滤)
直接输出匹配进程号,结合kill使用
1 2 3 4 5 6 7 8 9 10 11
| [root@192 home]# pgrep bash 4197 4838 5279
[root@192 home]# pgrep -u root 1 2 ...
|
2.6 strace(跟踪进程调用)
strace: 会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行所消耗的时间等,是排查问题的杀手锏。常用命令:
1 2 3 4 5 6 7 8
| strace -tt -f + file path [root@192 home]# strace -tt -f nginx 00:01:20.720567 execve("/usr/sbin/nginx", ["nginx"], 0x7ffdb75cc900 /* 23 vars */) = 0 00:01:20.729122 brk(NULL) = 0x562feecd6000 00:01:20.748064 arch_prctl(0x3001 /* ARCH_??? */, 0x7ffcf79be8f0) = -1 EINVAL (Invalid argument) 00:01:20.753934 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 00:01:20.762608 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 ...
|
注:strace命令很适合处理程序僵尸、命令执行报错等问题,当我们的日志看不出问题出现的原因时,使用strace可能有意想不到的收获。
2.7 ltrace(跟踪进程调用)
ltrace:能够跟踪进程的库函数调用,它会显现出调用了哪个库函数,而strace则是跟踪进程的每个系统调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| [root@192 home]# ltrace nginx gettimeofday(0x7ffee104e0e0, nil) = 0 clock_gettime(1, 0x7ffee104e130, 960, 0) = 0 memcpy(0x5610ffc6b584, "4", 1) = 0x5610ffc6b584 memcpy(0x5610ffc6b58a, "2025", 4) = 0x5610ffc6b58a memcpy(0x5610ffc6b58f, "16", 2) = 0x5610ffc6b58f ...... getpid() = 4745 getppid() = 4744 open64("/var/log/nginx/error.log", 1089, 0644) = 5 OPENSSL_init_ssl(64, 0, 0, 0x7f707bb1c6a5) = 1 ERR_clear_error(0x7f707c13b864, 1, 0x7fffffff, 0x7f707baaf96e) = 0x7f707be087a0 CRYPTO_get_ex_new_index(0, 0, 0, 0) = 1 CRYPTO_get_ex_new_index(1, 0, 0, 0) = 1 CRYPTO_get_ex_new_index(1, 0, 0, 0) = 2 CRYPTO_get_ex_new_index(1, 0, 0, 0) = 3 CRYPTO_get_ex_new_index(1, 0, 0, 0) = 4 CRYPTO_get_ex_new_index(1, 0, 0, 0) = 5 CRYPTO_get_ex_new_index(3, 0, 0, 0) = 1 CRYPTO_get_ex_new_index(3, 0, 0, 0) = 2 CRYPTO_get_ex_new_index(3, 0, 0, 0) = 3 posix_memalign(0x7ffee104e150, 16, 1024, 0) = 0 malloc(16) = 0x5611285ec620 strlen("nginx") = 5 malloc(6) = 0x5611285ed470 uname(0x7ffee104dfd0) = 0 strlen("SHELL=/bin/bash") = 15 strlen("HISTCONTROL=ignoredups") = 22 strlen("HISTSIZE=1000") = 13 strlen("HOSTNAME=192.168.135.174") = 24 strlen("PWD=/home") = 9 strlen("LOGNAME=root") = 12 strlen("MOTD_SHOWN=pam") = 14 strlen("HOME=/root") = 10 strlen("LANG=zh_CN.UTF-8") = 16 strlen(^C"LS_COLORS=rs=0:di=01;34:ln=01;36"... <no return ...> --- SIGINT (Interrupt) --- +++ killed by SIGINT +++ ......
|
补充一个命令runlevel:用来查看系统运行级别,系统级别一般为:0(停机),1(单用户模式),2(无网络多用户),3(多用户),4(未使用),5(图形),6(重启)
1 2 3 4 5 6 7 8 9 10
| [root@192 home]# ltrace runlevel nginx setlocale(LC_ALL, "") = "zh_CN.UTF-8" log_setup(0, 0x7f827fabb910, 1, 0) = 0xffffffff rlimit_nofile_bump(0x80000, 0x7f8281895244, 5, 0) = 0 sigbus_install(0, 7, 0, 0x7f828151e695) = 0 invoked_as(0x7ffe629f9878, 0x5557aeb46b76, 0, 0x7f828145f0c3) = 0 invoked_as(0x7ffe629f9878, 0x5557aeb46b6d, 97, 0x7ffe629fa6df) = 0 invoked_as(0x7ffe629f9878, 0x5557aeb46eb9, 111, 0x7ffe629fa6df) = 0 ...... +++ exited (status 1) +++
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| [root@192 home]# runlevel N 3
N 是 None 的缩写,表示系统启动后没有切换过运行级别(即当前运行级别是系统启动时的默认级别)。
如果之前切换过运行级别(例如从 5 切换到 3),这里会显示前一个级别(如 5)。
表示系统处于 多用户文本模式(无图形界面),这是服务器环境的标准配置。
运行级别 3 的特点:
支持多用户登录(通过终端或 SSH)。
启用网络服务(如 HTTP、SSH、数据库等)。
不启动图形界面(GUI)。
|
常见运行级别对照表
运行级别 |
用途 |
0 |
关机模式(init 0 会关闭系统)。 |
1 |
单用户模式(维护模式,仅 root 可登录,用于系统修复)。 |
2 |
多用户模式(无网络服务,极少使用)。 |
3 |
多用户文本模式(标准服务器模式,启用网络服务)。 |
4 |
保留未使用(用户可自定义)。 |
5 |
图形界面模式(桌面环境,如 GNOME、KDE)。 |
6 |
重启模式(init 6 会重启系统)。 |
3.结束进程-kill、killall、pkill
kill:kill命令能够终止你希望停止的进程。 常用的方式如下:
pkill:pkill命令可通过进程名终止指定的进程,pkill作用和killall一样,他与killall有以下不同:
4.进程启动-nohup、init
4.1-nohup
基本语法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 1.查看帮助
2.使用nohup运行命令
command: 想要后台运行的命令 arguments: 传递给命令的值或参数(arguments可加可不加) (如果你需要运行一个程序,即使对应的 Shell 被退出后依然保持运行)
3.标准输出重定向到文件
4.标准错误输出重定向到文件
5.使用nohup命令在后台启动一个程序
6.使用nohup运行bash脚本
7.使用nohup同时运行多个程序
|
nohup
命令可以在后台运行程序,即使终端关闭或断开与远程服务器的连接也不会影响程序的运行。通过nohup
命令启动的进程会忽略所有终端信号,因此即使使用Ctrl+C
关闭终端,进程也不会停止。
可以使用jobs
命令查看后台运行的进程,并使用fg
命令将进程切换到前台运行。
nohup
非常适合用来执行一些需要长时间运行的脚本或程序,比如Web服务器,数据库等。但需要注意的是,nohup
命令并不是完全避免了进程被中断的可能,例如系统崩溃、进程错误等情况仍可能导致进程的中断。
4.2-init
切换运行级别:
查看当前运行级别:
服务管理:
1 2
| service httpd start chkconfig httpd on
|
5.进程修改-nice、renice(默认为0,优先级:-20~19)
-20(最高优先级)到+19(最低优先级)
5.1-nice
nice命令用于在启动进程时设置进程的初始优先级。
参数 |
描述 |
-n, –adjustment=N |
指定优先级的调整值 |
-h, –help |
显示帮助信息 |
-v, –version |
显示版本信息。 |
基础格式:
注意:
普通用户无法提升优先级(无法设置负值),否则会报错:
1
| nice: cannot set niceness: Permission denied
|
若需提升优先级,需使用 sudo
或切换至 root
用户。
5.2-renice
renice命令用于更改已经在运行的进程的优先级。
6.管理系统服务的工具-systemctl
systemctl 命令是一个在大多数现代 Linux 发行版中用于管理系统服务的工具。它可以启动、停止、重启、启用或禁用系统服务,还可以显示服务的状态和控制服务的启动顺序等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| 启动服务
停止服务
重启服务
开机自启服务
关闭开机自启服务
查看服务运行状态
重新加载 systemd 管理的服务单元配置。
列出当前正在运行的所有系统服务
systemctl isolate graphical.target
systemctl set-default multi-user.target
|
某些情况下可能存在无法通过 systemctl 管理的软件,例如:
- 手动安装的软件:如果你手动编译并安装了某个软件,但没有为其创建 systemd 服务单元文件,那么这个软件就不会被 systemd 所管理,因此无法使用 systemctl 来对其进行管理。
- 自定义安装路径:有些软件可能会被安装到非标准的路径,或者安装路径不在 systemd 默认的服务搜索路径中,这样 systemd 就无法正确识别这些软件并管理其服务。
在这些情况下,你可能需要手动创建一个 systemd 服务单元文件,以便让 systemd 能够管理这些软件。创建systemd服务单元的方法只需要简单的三步:
1.编写服务单元文件:
使用文本编辑器(如vim或nano)创建一个新的服务单元文件,通常存储在/etc/systemd/system/目录下,以.service为后缀名。
2.编辑服务单元文件
定义服务的名称、描述、执行路径等信息。
例如:
1 2 3 4 5 6 7 8
| [Unit] Description=My Custom Service After=network.target [Service] Type=simple ExecStart=/path/to/your/executable [Install] WantedBy=multi-user.target
|
3.重新加载systemd管理器配置:
使用以下命令重新加载systemd管理器的配置,以使新的服务单元生效:
4.目标管理:
1 2
| systemctl isolate graphical.target systemctl set-default multi-user.target
|
5.日志查看
1 2 3 4 5
| journalctl -u httpd
journalctl --since "2023-10-01" --until "2023-10-02"
|