网络管理

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
# pgrep 服务名(进程名)
[root@192 home]# pgrep bash
4197
4838
5279

# -u 用户名
[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(前一个运行级别):

N 是 None 的缩写,表示系统启动后没有切换过运行级别(即当前运行级别是系统启动时的默认级别)。

如果之前切换过运行级别(例如从 5 切换到 3),这里会显示前一个级别(如 5)。


# 3(当前运行级别):

表示系统处于 多用户文本模式(无图形界面),这是服务器环境的标准配置。

运行级别 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命令能够终止你希望停止的进程。 常用的方式如下:

1
2
3
4
# kill + pid (终止进程)
# kill + -9 + pid (强制终止)
# kill + -0 + pid (验证进程是否存在)
# killall: 个人觉得这个在日常的shell脚本更为实用,因为我们会发现一个应用可能会启用多个进程,即会产生多个pid,如果用kill会很麻烦,直接用killall会方便多(前提是进程名一样)

pkill:pkill命令可通过进程名终止指定的进程,pkill作用和killall一样,他与killall有以下不同:

1
2
3
# pkill + 进程名(可以模糊匹配,killall不支持)

# 使用killall终止进程需要连续执行几次,而pkill可以杀死指定进程及其所有子进程

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.查看帮助
# nohup --help

2.使用nohup运行命令
# 将输出的值默认输出到当前位置的nohup.out(自动创建的文件)中
# nohup command arguments
command: 想要后台运行的命令
arguments: 传递给命令的值或参数(arguments可加可不加)
(如果你需要运行一个程序,即使对应的 Shell 被退出后依然保持运行)

3.标准输出重定向到文件
# 将原来输出到nohup.out中的内容 输出到指定的文件中
# nohup ./myScript.sh > ~/output/myOutput.txt

4.标准错误输出重定向到文件
# nohup bash test.sh 2> stderr.txt &

5.使用nohup命令在后台启动一个程序
# 想要让程序重新回到终端,可以使用 fg 命令。
# nohup command arguments &

6.使用nohup运行bash脚本
# nohup bash test.sh &

7.使用nohup同时运行多个程序
# nohup bash -c 'mkdir files && ping -c 1 baidu.com && ls'> output.txt

nohup命令可以在后台运行程序,即使终端关闭或断开与远程服务器的连接也不会影响程序的运行。通过nohup命令启动的进程会忽略所有终端信号,因此即使使用Ctrl+C关闭终端,进程也不会停止。

可以使用jobs命令查看后台运行的进程,并使用fg命令将进程切换到前台运行。

nohup非常适合用来执行一些需要长时间运行的脚本或程序,比如Web服务器,数据库等。但需要注意的是,nohup命令并不是完全避免了进程被中断的可能,例如系统崩溃、进程错误等情况仍可能导致进程的中断。

4.2-init

切换运行级别:

1
2
init 3          # 切换到多用户文本模式
telinit 5 # 切换到图形界面

查看当前运行级别:

1
runlevel        # 输出示例:N 3(N 表示前一个运行级别)

服务管理:

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
2
3
# nice -n 命令
例子:
# nice -1 top
注意:

普通用户无法提升优先级(无法设置负值),否则会报错:

1
nice: cannot set niceness: Permission denied

若需提升优先级,需使用 sudo 或切换至 root 用户。

5.2-renice

renice命令用于更改已经在运行的进程的优先级。

1
2
3
# sudo renice -n -p (p是pid值)
例子:
# sudo renice 6 4635

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
启动服务
# systemctl start <service-name>

停止服务
# systemctl stop <service-name>

重启服务
# systemctl restart <service-name>

开机自启服务
# systemctl enable <service-name>

关闭开机自启服务
# systemctl disable <service-name>

查看服务运行状态
# systemctl status <service-name>

重新加载 systemd 管理的服务单元配置。
# systemctl daemon-reload

列出当前正在运行的所有系统服务
# systemctl list-units --type=service

# 切换到图形界面
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管理器的配置,以使新的服务单元生效:

1
# sudo systemctl daemon-reload

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"

网络管理
https://bote798.top/2025/04/03/网络管理/
作者
bote798
发布于
2025年4月3日
许可协议