文章目录
- 前言:
- 一、查看进程
- 1.1 程序和进程的关系
- 1.2 查看进程
- 二、进程的启动方式:
- 三、进程的前后台调度
- 四、中止进程的运行
- 总结:
前言:
在windows系统中,我们一般通过任务管理器查看进程,在Linux中查看进程分为:静态查看、动态查看,控制进程分为:按条件进行停止进程、全部停止。Linux任务管理分为:at(一次性任务设置)、crontab(周期性任务设置)。
一、查看进程
1.1 程序和进程的关系
程序:
保存在硬盘、光盘等介质中的可执行代码和数据
静态保存的代码
进程:
在CPU及内存中运行的程序代码
动态执行的代码
父、子进程
每个进程可以创建一个或多个进程
应用程序
一个应用层中包含一个或多个进程
进程
一个进程包括一个或多个线程
线程
执行操作的最小/基本单元
1.2 查看进程
(一)、查看静态的进程统计信息
格式:ps [选项]
常用选项:
命令:ps aux(以简单列表的形式显示出进程信息),示例:
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128164 6812 ? Ss 11:05 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 11:05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 11:05 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 11:05 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 11:05 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 11:05 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 11:05 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 11:05 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 11:05 0:00 [kdevtmpfs]
root 13 0.0 0.0 0 0 ? S< 11:05 0:00 [netns]
root 14 0.0 0.0 0 0 ? S 11:05 0:00 [khungtaskd]
root 15 0.0 0.0 0 0 ? S< 11:05 0:00 [writeback]
root 16 0.0 0.0 0 0 ? S< 11:05 0:00 [kintegrityd]
root 17 0.0 0.0 0 0 ? S< 11:05 0:00 [bioset]
root 18 0.0 0.0 0 0 ? S< 11:05 0:00 [kblockd]
..................................... (省略以下部分)
上述信息种,各字段含义如下:
1、USER:启动该进程的用户账号的名称
2、PID 进程的ID号,有且只有一个
3、%CPU CPU占用率(百分比)
4、%MEM 内存占用率(百分比)
5、VSZ 虚拟内存
6、RSS 物理内存
7、TTY 终端,表明该进程在哪个终端运行。“?”表示未知或不需要终端。
8、STAT 显示进程当前的状态,常表现为:
9、START 启动该进程的时间
10、TIME 该线程占用的CPU的总时间
11、COMMAND 启动进程的命令名称
查看静态的进程统计信息
命令:ps -elf(以长格式显示系统中的进程信息),
示例:
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32041 ep_pol 11:05 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root 2 0 0 80 0 - 0 kthrea 11:05 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 11:05 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 11:05 ? 00:00:00 [kworker/0:0H]
1 S root 7 2 0 -40 - - 0 smpboo 11:05 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 11:05 ? 00:00:00 [rcu_bh]
1 R root 9 2 0 80 0 - 0 - 11:05 ? 00:00:00 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo 11:05 ? 00:00:00 [watchdog/0]
5 S root 12 2 0 80 0 - 0 devtmp 11:05 ? 00:00:00 [kdevtmpfs]
1 S root 13 2 0 60 -20 - 0 rescue 11:05 ? 00:00:00 [netns]
1 S root 14 2 0 80 0 - 0 watchd 11:05 ? 00:00:00 [khungtaskd]
1 S root 15 2 0 60 -20 - 0 rescue 11:05 ? 00:00:00 [writeback]
1 S root 16 2 0 60 -20 - 0 rescue 11:05 ? 00:00:00 [kintegrityd]
1 S root 17 2 0 60 -20 - 0 rescue 11:05 ? 00:00:00 [bioset]
1 S root 18 2 0 60 -20 - 0 rescue 11:05 ? 00:00:00 [kblockd]
1 S root 19 2 0 60 -20 - 0 rescue 11:05 ? 00:00:00 [md]
..................................... (省略以下部分)
以上输出信息的相关描述,与ps aux不同的字段含义如下:
ps -elf (加"-"代表所有显示)
1、PPID 详细列出进程的父进程 PID依赖父进程 (重要)
2、C CPU占用率
3、PRI 用户态进程优先级(人为可以控制称为用户态)
4、NI:nice值 :内核态 (调度器,取值范围为“-20~19”,值越小,占用资源的优先度越高
5、ADDR : “-” 表示正在运行
6、SZ 交换分区占用的容量,swap(虚拟内存与真实内存之间交换其中的信息,来完善系统中一系列任务的操作与运行。)
7、WCHAN :当前进程在内核中的名称
(二)、查看动态进程(top)
不同于ps命令,top命令可以动态查看进程信息,动态更新时间为3秒,top命令将会在当前终端以全屏交互式的界面进程排名,类似于Windows系统中的任务管理器。
格式:top
示例:
[root@localhost ~]# top
top - 15:17:07 up 4:11, 1 user, load average: 0.08, 0.06, 0.05
Tasks: 146 total, 1 running, 145 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 1867024 total, 1136096 free, 318420 used, 412508 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 1333684 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
652 root 20 0 305296 6296 4912 S 0.7 0.3 0:59.28 vmtoolsd
4753 root 20 0 0 0 0 S 0.7 0.0 0:00.52 kworker/0:2
4658 root 20 0 157724 2248 1544 R 0.3 0.1 0:01.47 top
1 root 20 0 128164 6812 4048 S 0.0 0.4 0:03.05 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.29 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
以上输出的信息描述含义如下:
系统任务(task)信息:
total : 总进程数
runnnig:正在运行的进程数
sleeping :休眠的进程数
stopped:中止的进程数
zombie : 僵尸进程的进程数
1、CPU占用信息:us表示用户占用;sy表示内核占用;ni 优先级调度占用;id表示空闲CPU;wa表示I/O等待占用;hi表示硬件中断应用;si表示软件中断占用;st表示虚拟化占用。
2、内存(Mem)占用信息:total表示总内存空间;used表示已用内存;free表示空闲内存;buffers表示缓冲区域。
3、交换空间(swap)占用:total表示总交换空间;used表示已用交换空间;free表示空闲交换时间;cached表示缓存空间。
我们可以通过快捷键对需要查看的信息进行排序,例如:C(CPU占用率)、M (内存占用)
退出快捷键为q
(三)、按条件查询进程信息(pgrep命令)
指定查询进程的PID信息与进程名:
格式:pgrep -l ”log“ (长格式显示包含log的进程名称和PID)
查看指定用户PID信息与进程名:
pgrep -l -u zhangsan (指定查询用户zhangsan的所有进程)
示例:
[root@localhost ~]# pgrep -l -U zhangsan
1720 gnome-keyring-d
1740 gnome-session-b
1747 dbus-launch
1748 dbus-daemon
1806 gvfsd
1811 gvfsd-fuse
1903 ssh-agent
1922 at-spi-bus-laun
1927 dbus-daemon
1932 at-spi2-registr
1949 gnome-shell
1957 pulseaudio
1967 ibus-daemon
1972 ibus-dconf
1976 ibus-x11
1982 gnome-shell-cal
1985 xdg-permission-
1992 mission-control
1995 gvfs-udisks2-vo
2010 goa-daemon
2015 evolution-sourc
..................................... (省略以下部分)
如图,我们可以看到用户zhangsan的全部进程及对应的PID号。
同时我们还可以查询指定用户、指定终端的PID号与指定进程的命令名称
命令:pgrep -l -U zhangsan -t pts/0
[root@localhost ~]# pgrep -l -U zhangsan -t pts/0
3250 bash
3283 su
(四)、树形结构的查看
以树形结构引出进程信息,更加直观的判断出各进程之间的相互关系(父、子进程),默认情况下只显示各进程的名称。
格式:pstree -aup
“-a” 表示显示完整信息
“-u” 列出对应的用户名
“-p” 列出对应的PID号
示例:
[root@localhost ~]# pstree -aup
systemd,1 --switched-root-
├─ModemManager,667
│ ├─{ModemManager},680
│ └─{ModemManager},684
├─NetworkManager,713 --no-daemon
│ ├─dhclient,835 -d -q -sf...
│ ├─{NetworkManager},718
│ └─{NetworkManager},720
├─VGAuthService,655 -s
├─abrt-watch-log,642 -F BUG:WARNING: a
├─abrt-watch-log,668 -F Backtrace/var/
├─abrtd,641 -d -s
├─accounts-daemon,619
│ ├─{accounts-daemon},621
│ └─{accounts-daemon},624
├─alsactl,631 -s -n 19 -c -EALSA_CONF
├─at-spi-bus-laun,1922,zhangsan
│ ├─dbus-daemon,1927...
│ │ └─{dbus-daemon},1928
│ ├─{at-spi-bus-laun},1923
│ ├─{at-spi-bus-laun},1924
│ └─{at-spi-bus-laun},1926
├─at-spi2-registr,1932,zhangsan...
│ ├─{at-spi2-registr},1936
│ └─{at-spi2-registr},1937
├─atd,1052 -f
├─auditd,594
..................................... (省略以下部分)
通过以上输出信息可以更直观的判断出各进程之间的相互关系(父、子进程),默认情况下只显示各进程的名称。
指定用户的进程树结构进行查询:
[root@localhost ~]# pstree -ap zhangsan
at-spi-bus-laun,1922
├─dbus-daemon,1927...
│ └─{dbus-daemon},1928
├─{at-spi-bus-laun},1923
├─{at-spi-bus-laun},1924
└─{at-spi-bus-laun},1926
at-spi2-registr,1932--use-gnome
├─{at-spi2-registr},1936
└─{at-spi2-registr},1937
dbus-daemon,1748 --fork --print-pid 4--pr
└─{dbus-daemon},1749
dbus-launch,1747 --sh-syntax...
dconf-service,2034
├─{dconf-service},2038
└─{dconf-service},2039
..................................... (省略以下部分)
二、进程的启动方式:
(一)、手工启动(cp)
手工启动分为:前台启动和后台启动
前台启动:用户输入命令,直接执行程序或任务
例如我们日常使用的“cp /opt/test /home” (将opt目录下的test复制到/home中)
后台启动:在命令行尾加入“&”符号
命令:cp /dev/cdrom mycd.iso & (在后台启动mycd.iso进程)
示例:
[root@localhost ~]# cp /dev/cdrom mycd.iso &
[1] 4118
[1] 4118 为后台任务序号与PID号。
(二)、调度启动进程
使用“at”命令,设置一次性计划任务
使用“crontab”命令,设置周期性计划任务
“at”一次性创建,示例:
[root@localhost ~]# date (查询当前时间)
2019年 11月 12日 星期二 19:10:19 CST
[root@localhost ~]# at 19:14 2019-11-12 (在2019年11月12日19:14分执行一次任务)
at> pgrep -U root | wc -l > /opt/可用 (输入需要执行的命令)
at> <EOT> (命令输入完成后按ctrl+d完成设置)
job 3 at Tue Nov 12 19:14:00 2019 (进程将在19年19:14执行)
[root@localhost ~]# atq
1 Tue Nov 12 19:14:00 2019 a root (输入完命令后输入atq命令可见当前待执行的任务)
[root@localhost ~]# atq (19:14时,再次查看可发现已无待执行任务)
[root@localhost ~]# ls /opt
rh test001.txt 可用 (创建成功)
我们可以直接用atrm 2 (2为序列号,命令功能为删除后台执行未见序列号为2的任务)
“crontab”周期性创建
我们先查看crontab的配置文件:
[root@localhost ~]# cat /etc/crontab (crontab的配置文件目录)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59) (分钟)
# | .------------- hour (0 - 23) (小时)
# | | .---------- day of month (1 - 31) (月)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... (月)
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat (日)
# | | | | |
# * * * * * user-name command to be executed (想要执行的命令)
设置周期性任务:
命令:crontab [选项] [-u]
常用选项有:
-e 设置新周期性任务
-l 查看周期性任务
-r 全部删除
示例:
查看时间 date
[root@localhost home]# date
2019年 11月 12日 星期二 22:05:25 CST
设置任务:
[root@localhost bin]# crontab -e
10 22 * * * /usr/bin/cp -r /home/wangwu /opt
(每天的22点10分将wangwu的家目录复制到/opt中)
上述输入信息含义如下:
查看待执行的任务:
[root@localhost ~]# crontab -l
10 22 * * * /usr/bin/cp -r /home/wangwu /opt
等到22:10分时,查看opt目录,如下:
[root@localhost bin]# ls /home
dings02 wangwu
我们可以设置多条周期性任务,当我们想要全部删除时,可以使用:crontab -r。
如果我们指向删除其中一个任务时,我们可以使用crontab -e 进入设置,然后删除不需要的命令。
三、进程的前后台调度
我们学习了将进程设置为后台启动,这里我们介绍下进程的前后台调度。
1、Ctrl + z :表示将进程挂起,即进入后台并停止执行;
示例:
[root@localhost ~]# cp /dev/cdrom mycd.iso (在前台执行cdrom的镜像文件)
^Z
[1]+ 已停止 cp -i /dev/cdrom mycd.iso
(在进程运行中时,按Ctrl+z ,任务将停止并放入后台)
2、jobs命令:查看处于后台的任务列表
jobs -l 还可以显示出该进程对应的PID号
示例:
[root@localhost ~]# jobs -l
[1]+ 3282 停止 cp -i /dev/cdrom mycd.iso
(查看后台任务列表)
3、fg命令:将后台进程恢复到前台运行,可指定序列号
4、bg命令:可将后台中暂停执行的任务恢复运行,继续在后台执行操作
PS:除非后台中的任务只有一个,不然执行fg命令与bg命令时,需要指定后台进程的任务编号作为参数
示例:
[root@localhost ~]# fg (将后台进程恢复到前台运行)
cp -i /dev/cdrom mycd.iso
^Z (这里我么继续先暂停并转入后台)
[1]+ 已停止 cp -i /dev/cdrom mycd.iso
[root@localhost ~]# bg 将后台中暂停执行的任务恢复运行,继续在后台执行操作)
[1]+ cp -i /dev/cdrom mycd.iso & (&代表在后台执行)
[root@localhost ~]# jobs -l (查询后台任务列表可见已恢复运行)
[1]+ 3282 运行中 cp -i /dev/cdrom mycd.iso &
四、中止进程的运行
Ctrl +C 组合键
中断正在执行的命令
kill、killall命令
kill -9 用户终止指定的PID号的进程
killall -9用户终止指定名称的所有进程
pkill -9 -U 用户 根据特定条件终止相应的进程,可以根据进程的名称、该进程的用户、进程所在的终端等多种属性终止特定的进程
-9 选项用于强制终止
实验:
使用指定PID号的形式终止进程:
[root@localhost ~]# vim test1.txt & (设置后台运行)
[1] 3433 (3433为PID号)
[root@localhost ~]# jobs -l (查询后台列表)
[1]+ 3433 停止 (tty 输出) vim test1.txt
[root@localhost ~]# kill -9 3433 (强制终止PID号为3433的任务)
[root@localhost ~]# jobs -l
[1]+ 3433 已杀死 vim test1.txt
(已被终止)
使用killall终止指定名称的所有进程:
[root@localhost ~]# vim test1.txt &
[1] 3467
[root@localhost ~]# vim test2.txt &
[2] 3468
[1]+ 已停止 vim test1.txt
[root@localhost ~]# vim test3.txt &
[3] 3469
[2]+ 已停止 vim test2.txt
[root@localhost ~]# jobs -l
[1] 3467 停止 (tty 输出) vim test1.txt
[2]- 3468 停止 (tty 输出) vim test2.txt
[3]+ 3469 停止 (tty 输出) vim test3.txt
[root@localhost ~]# killall -9 vim
[1] 已杀死 vim test1.txt
[2]- 已杀死 vim test2.txt
[3]+ 已杀死 vim test3.txt
[root@localhost ~]#
以上我们连续进行三种同类型的任务,然后使用killall 终止所有vim类型的任务。
强制终止用户wangwu 的进程:
[root@localhost ~]# pkill -9 -U wangwu
[root@localhost ~]#
总结:
需注意:
使用命令crontab -e设置周期性任务时,“run_command”(任务内容设置)中,需在命令符前加上此命令的绝对路径,例如:“/usr/bin/cp -r ”对此,我们可以使用which [命令]来查找此命令的绝对路径。