Linux中进程调度常见命令
- ps 查看系统中的进程
- top 动态显示系统中的进程
- kill 杀死进程
- jobs 查看后台运行的进程
举栗
ps -e //查看所有进程 ps -u //显示当前用户和终端进程 ps -l //长格式显示当前用户进程 ps -le //长格式显示所有进程 kill xxx //结束xxx进程(xxx是进程的PID) kill -9 xxx //强制结束xxx进程(xxx是进程的PID
[root@iZ2vc8owmlobwkazif1efpZ ~]# top
top - 14:52:36 up 3 days, 20:14, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 87 total, 1 running, 86 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1776196 total, 159964 free, 202172 used, 1414060 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1396896 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1298 root 10 -10 135364 18828 10108 S 0.7 1.1 51:48.33 AliYunDun
1 root 20 0 125500 3984 2616 S 0.0 0.2 0:04.43 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:00.80 kworker/u4:0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.38 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.02 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:47.99 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.96 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:01.06 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:00.02 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/1
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
20 root 20 0 0 0 0 S 0.0 0.0 0:00.07 khungtaskd
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
[root@iZ2vc8owmlobwkazif1efpZ ~]#
[root@iZ2vc8owmlobwkazif1efpZ ~]# ps -e
PID TTY TIME CMD
1 ? 00:00:04 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
5 ? 00:00:00 kworker/u4:0
6 ? 00:00:00 ksoftirqd/0
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:48 rcu_sched
10 ? 00:00:00 lru-add-drain
11 ? 00:00:00 watchdog/0
12 ? 00:00:01 watchdog/1
13 ? 00:00:00 migration/1
14 ? 00:00:00 ksoftirqd/1
16 ? 00:00:00 kworker/1:0H
18 ? 00:00:00 kdevtmpfs
19 ? 00:00:00 netns
20 ? 00:00:00 khungtaskd
21 ? 00:00:00 writeback
22 ? 00:00:00 kintegrityd
23 ? 00:00:00 bioset
24 ? 00:00:00 bioset
25 ? 00:00:00 bioset
26 ? 00:00:00 kblockd
27 ? 00:00:00 md
28 ? 00:00:00 edac-poller
29 ? 00:00:00 watchdogd
36 ? 00:00:00 kswapd0
37 ? 00:00:00 ksmd
38 ? 00:00:00 khugepaged
39 ? 00:00:00 crypto
47 ? 00:00:00 kthrotld
48 ? 00:00:01 kworker/u4:1
49 ? 00:00:00 kmpath_rdacd
50 ? 00:00:00 kaluad
51 ? 00:00:00 kpsmoused
52 ? 00:00:00 ipv6_addrconf
65 ? 00:00:00 deferwq
100 ? 00:00:00 kauditd
238 ? 00:00:00 ata_sff
244 ? 00:00:00 scsi_eh_0
245 ? 00:00:00 scsi_tmf_0
246 ? 00:00:00 scsi_eh_1
247 ? 00:00:00 scsi_tmf_1
249 ? 00:00:00 ttm_swap
255 ? 00:00:00 kworker/0:1H
266 ? 00:00:00 kworker/1:1H
267 ? 00:00:01 jbd2/vda1-8
268 ? 00:00:00 ext4-rsv-conver
361 ? 00:00:01 systemd-journal
382 ? 00:00:00 systemd-udevd
461 ? 00:00:00 auditd
503 ? 00:00:00 nfit
527 ? 00:00:01 systemd-logind
529 ? 00:00:00 polkitd
531 ? 00:00:02 dbus-daemon
543 ? 00:00:01 chronyd
772 ? 00:00:00 dhclient
827 ? 00:00:27 tuned
947 ? 00:00:00 master
949 ? 00:00:00 qmgr
1044 ? 00:00:12 rsyslogd
1048 ? 00:01:07 aliyun-service
1052 ? 00:00:00 atd
1053 ? 00:00:00 crond
1059 ttyS0 00:00:00 agetty
1060 tty1 00:00:00 agetty
1172 ? 00:00:00 sshd
1239 ? 00:04:16 AliYunDunUpdate
1298 ? 00:51:52 AliYunDun
1442 ? 00:02:32 AliSecGuard
1568 ? 00:04:16 containerd
1578 ? 00:00:37 dockerd
21460 ? 00:00:00 docker-proxy
21466 ? 00:00:00 docker-proxy
21481 ? 00:00:02 containerd-shim
21501 ? 00:00:00 nginx
21578 ? 00:00:00 nginx
23301 ? 00:00:00 kworker/1:0
23348 ? 00:00:00 pickup
23380 ? 00:00:00 kworker/0:2
23391 ? 00:00:00 kworker/0:0
23394 ? 00:00:00 kworker/1:1
23395 ? 00:00:00 sshd
23397 pts/0 00:00:00 bash
23429 pts/0 00:00:00 ps
[root@iZ2vc8owmlobwkazif1efpZ ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 23397 23395 0 14:50 pts/0 00:00:00 -bash
root 23442 23397 0 15:01 pts/0 00:00:00 ps -f
[root@iZ2vc8owmlobwkazif1efpZ ~]#
二、Linux 进程控制编程
1、fork概述
fork()基本介绍
- 在Linux 中创建一个新进程的惟一方法是使用fork()函数。
- fork()函数是Linux 中一个非常重要的函数,和以往遇到的函数有一些区别,因为它看起来执行一次却返回两个值。
fork()函数说明
- fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。
- 使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
- 实际上,在父进程中执行fork()函数时,父进程会复制出一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行。从而两个进程分别获得其所属fork()的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判定该进程是父进程还是子进程。
- 同时可以看出,使用fork()函数的代价是很大的,它复制了父进程中的代码段、数据段和堆栈段里的大部分内容,使得fork()函数的系统开销比较大,而且执行速度也不是很快。
exec 函数族说明
- fork()函数是用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,如何在进程中执行其他程序呢?exec函数族就提供了一个在进程中启动另一个程序执行的方法。
- exec 函数族可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。
- 在进程中使用exec函数族的作用是使运行结果替换原有进程,所以为了避免父进程被替换掉,需要先在父进程中通过fork()函数创建子进程,然后在子进程中使用exec函数。
- 在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,再利用exec系统调用将新产生的子进程完全替换成ps进程
在Linux 中使用exec 函数族主要有两种情况。
- 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用exec函数族中的任意一个函数让自己重生。
- 如果一个进程想执行另一个程序,那么它就可以调用fork()函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。



