文章目录
- 一、线程、进程、程序的概念
- 什么是程序?
- 什么是线程?
- 什么是进程?
- 线程与进程的关系
- 线程与进程的区别
- 程序与进程的区别
- 二、查看进程的方式
- 查看静态的进程统计信息——ps
- ps -aux命令
- ps -elf命令
- ps查看线程命令
- 过滤查询——grep
- 查看动态的进程排名信息——top
- top常用命令
- top查看线程命令
- 常见load字段相关问题
- 根据特定条件查看进程PID信息——pgrep
- 以树形结构列出进程信息——pstree
- 三、进程的启动与控制
- 1、手动启动
- nohup命令——终端关闭后任务依旧启动
- 2、进程的前后台调度
- Ctrl + Z 组合键
- jobs命令
- fg命令
- 3、终止程序的运行
- Ctrl + C组合键
- kill命令
- killall命令
- pkill命令
- 四、计划任务管理
- 设置一次性计划任务——at命令
- 设置周期性计划任务——crontab命令
一、线程、进程、程序的概念
什么是程序?
程序是保存在硬盘、光盘等介质中的可执行代码和数据,它是在文件中静态保存的代码。通常可以理解为程序员写的代码,代码保存在文件中,存储在硬盘里面。
什么是线程?
线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
一个线程可与同属一个进程的其他线程共享进程所拥有的全部资源,所以线程和其同属的进程共用一个PID。由于线程之间的相互制约,致使如果同进程中的一个线程出现故障,那么其他的线程都会挂掉。
什么是进程?
进程是指在系统中正在运行的一个应用程序,程序一旦运行就是进程。
进程是在CPU及内存中运行的程序代码,因此是动态执行的代码。进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间,即每个进程的PID号不同。根据程序的不同需求有父子进程,所有每个程序可以创建一个或多个进程。
线程与进程的关系
1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
2. 资源分配给进程,同一进程内的所有线程共享该进程的所有资源;
3. 线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;
4. 处理机分配给线程,即真正在处理机上运行的是线程;
5. 线程是进程的一个执行单元,也是进程内的可调用实体。
线程与进程的区别
1. 线程共享内存空间;进程的内存是独立的;
2. 同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现;
3. 创建新进程很简单;创建新线程需要对其父进程进行一个克隆;
4. 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程;
5. 改变注线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。
6.调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位
7.并发性:不进进程之间可以并发执行,同一进程内的线程也可以并发执行
8.拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源
9.系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。
总结:多线程执行效率高; 多进程耗资源,安全。
程序与进程的区别
1. 程序是数据和指令的集合, 是一个静态的概念, 就是一堆代码, 可以长时间的保存在系统中;
2. 进程是程序运行的过程, 是一个动态的概念, 进程存在着生命周期, 也就是说进程会随着程序的终止而销毁, 不会永久存在系统中。
二、查看进程的方式
查看静态的进程统计信息——ps
ps -aux命令
常用命令格式
ps -aux
常用选项及其含义
选项 | 含义 |
---|---|
-a | 显示终端上的所有进程,包括其它用户的进程。 |
-u | 表示列出进程的用户。 |
-x | 显示所有终端的进程。 |
其中-
可加可不加,效果相同。
基本使用方式以及相关字段含义
[root@host ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 232 1.2 0.4 68292 17836 ? R 15:49 0:00 @usr/sbin/
root
:USER,进程的用户。
232
:PID,进程的ID。
1.2
:%CPU,进程占用的CPU百分比。
0.4
:ME1M,占用内存的百分比。
68292
:VSZ,该进程使用的虚拟内存量(KB) 。
17836
:RSS,该进程占用的物理内存量(KB) 。
?
:TTY,启动进程的终端名。不是从终端启动的进程则显示为?
。
R
:STAT,该进程的状态(D:不可中断的休眠状态。R:正在运行状态﹔S:处于休眠状态,可被唤醒,T:停止状态,可能是在后台暂停或进程处于跟踪调试状态。Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)。
15:49
:START,该进程被触发启动时间。
0:00
:TIME,该进程实际使用CPU运行的时间。
@usr/sbin/
:COMMAND,进程的启动命令,可以用绝对路径来表示。
排序显示进程状态
ps aux --sort -%cpu | head -10 按cpu降序排列,-为降序,+为升序,p与%同义
ps aux --sort +pmem | head -n 10 按内存升序排列
ps aux --sort -pcpu,+pmem | head -n 10
僵尸进程出现的原因
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。
但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
ps -elf命令
基本命令格式
ps -elf
ps -ef
常用选项及其含义
选项 | 含义 |
---|---|
-e | 显示系统内的所有进程信息。 |
-l | 使用长格式显示进程信息。 |
-f | 使用完整的格式显示进程信息。 |
其中-
必须要加。
使用方式以及相关字段含义
[root@host ~]# 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 - 48443 ep_pol 15:49 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
4
:F,内核分配给进程的系统标记。
S
:S,进程的状态(D:不可中断的休眠状态。R:正在运行状态﹔S:处于休眠状态,可被唤醒,T:停止状态,可能是在后台暂停或进程处于跟踪调试状态。Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)。
root
:UID,启动这些进程的用户。
1
:PID,进程的进程ID。
0
:PPID,父进程的进程号(如果该进程是由另一个进程启动的)。
0
:C,进程生命周期中的CPU利用率。
80
:PRI,进程的优先级(越大的数字代表越低的优先级)。
0
:NI,谦让度值用来参与决定优先级。
-
:ADDR,进程的内存地址。
48443
:SZ,假如进程被换出,所需交换空间的大致大小。
ep_pol
:WCHAN,若该进程在睡眠,则显示睡眠中的系统函数名。
15:49
:STIME,进程启动时的系统时间。
?
:TTY,进程启动时的终端设备。
00:00:02
:TIM,运行进程需要的累计CPU时间。
/usr/lib/systemd/systemd --switched-root --system --deserialize 22
:CMD,进程的启动命令。
ps查看线程命令
基本命令格式
//显示所有线程
ps -aT //查看指定进程中已经起的线程,即查看某个线程
ps -T -p <pid>//查看指定进程中的线程信息
ps -L <pid>
过滤查询——grep
由于系统中运行的进程数量较多,需要查询某一个进程的信息时可以结合管道操作和grep命令进行过滤。
基本使用方式
[root@host ~]# ps -aux | grep bash
root 701 0.0 0.0 115408 948 ? S 15:56 0:00 /bin/bash/usr/sbin/ksmtuned
root 3788 0.0 0.0 116752 3288 pts/0 Ss 18:23 0:00 -bash
root 4263 0.0 0.0 112828 972 pts/0 S+ 19:06 0:00 grep --color=auto bash
查看动态的进程排名信息——top
基本命令格式
top
使用方式以及相关字段含义
[root@host ~]# top
top - 16:50:56 up 1:01, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 157 total, 1 running, 156 sleeping, 0 stopped,0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861300 total, 2837720 free, 610816 used, 412764 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 2993320 avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 193772 6928 4184 S 0.0 0.2 0:02.04 systemd
...
默认情况下每5秒刷新一次
第一行是任务队列信息
top - 16:50:56 up 1:01, 1 user, load average: 0.00, 0.01, 0.05
16:50:56
:系统时间。
up 1:01
:系统己运行时长。
1 user
:当前登录用户数。
load average: 0.00, 0.01, 0.05
: 系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。
第二行为进程信息
Tasks: 157 total, 1 running, 156 sleeping, 0 stopped,0 zombie
Tasks
:总进程数
running
: 正在运行的进程数
sleeping
:休眠的进程数
stopped
:中止的进程数
zombie
:僵死的进程数
第三行为CPU的信息
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
默认显示所有CPU的平均使用情况,如果系统有多个CPU,想查看每个CPU的使用情况,可以按数字”1“,调出所有的CPU。
us
:用户占用
sy
:内核占用
ni
:优先级调度占用
id
:空闲CPU,要了解空闲的CPU百分比,主要看%id部分
wa
:I/O等待占用
hi
:硬件中断用
si
:软件中断占用
st
:虚拟化占用
第四行为内存的信息
KiB Mem : 3861300 total, 2837720 free, 610816 used, 412764 buff/cache
total
:总内存空间
free
:空闲内存
used
:己用内存
buff/cache
:物理内存和交换内存的缓冲区总和
第五行为交换空间的信息
KiB Swap: 4194300 total, 4194300 free, 0 used. 2993320 avail Mem
total
: 总交换空间
free
:空闲交换空间
used
:己用交换空间
avail Mem
:可用物理空间
进程信息区各列解释:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 193772 6928 4184 S 0.0 0.2 0:02.04 systemd
PID
:进程id
USER
:进程所有者的用户名
PR
:优先级
NI
:让度值。负值老示高优先级,正值表示低优先级
VIRT
:进程使用的虚拟内存总量,单位kb
RES
:进程使用的物理内存总量,单位kb
SHR
:共享内存大小,单位kb
S
:进程状态
%CPU
:上次更新到现在的CPu时间占用百分比
%MEM
:进程使用的物理内存百分比
TIME+
: 进程使用的CPU时间总计,单位1/100秒
COMMAND
:命令名/命令行
top常用命令
命令 | 含义 |
---|---|
P键 | 根据CPU使用百分比大小进行排字 |
M键 | 根据驻留内存大小进行排字 |
N键 | 根据启动时间进行排序 |
c键 | 切换显示命令名称和完整命令行 |
h键 | 可以获得top程序的在线帮助信息 |
1键 | 显示CPU个数(是数字中的1,而不是字母l) |
k键 | 根据提示输入指定进程的PID号并按Enter键终止对应的进程 |
q键 | 退出top程序 |
top查看线程命令
基本命令格式
//显示所有线程
top-H
//显示特定进程中的线程,即查看某个线程
top -H -p <pid>
常见load字段相关问题
如何查询load average
字段的命令
top命令、w命令、uptime命令
如何判断load average
字段的数字是否异常
CPU的平均负载和当前系统的CPU数量有关,如果系统是2核,而平均值在2或以上,说明CPU一直处于高负荷运行,即平均值是根据CPU数量而决定的。通常值在70%以下输入正常的,如果长时间高于 80%或者85%就属于异常。
CPU使用率高,但是找不到进程占用(CPU使用率高,负载(Load)很高)
产生的原因一句话总结就是:一个进程因配置问题等错误启动失败,但是被监控系统(supervisor)自动重启。而这个进程就是“短时进程”,也就是在其它应用内部调用exec执行外部命令,这些命令一般执行时间很多,但通过top,pidstat都很难发现,这就导致了负载过大,并且CPU使用率高。
1. 首先我们通过top
查看user CPU使用量,已经达到80%,但是看不到哪个进程占用;
2. 然后通过pidstat
查看CPU进程,也没有找到占用CPU使用量高的进程;
3. 然后我通过vmstat
查看r列活跃进程数,发现已经有超过CPU个数的活跃进程占用CPU;
4. 通过ps aux | grep R
查看活跃进程,执行多次可以发现多个“短时进程"启动停止;
5. perf record -g
, perf report
抓CPU性能事件,发现很多相同"短时进程"每个进程占用CPU不对,但是进程比较多;
6. pstree | grep
"短时进程名称"来分析是哪个进程制造的"短时进程”,需要对这个进程进行代码分析;
7. 可以定位为"短时进程"进程过多导致user CPU使用率升高,因为进程启动结束时间较短,所以top
, pidstat
不容易发现;
8. 假如抓取"短时进程"可以使用execSnoop工具,它通过frace
实时监控进程的exec()行为,并输出"短时进程"的基本信息,PID,父进程PID。
”CPU使用率低,负载(Load)很高“分析方法
产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是CPU运行的进程却很少,这样就体现到负载过大了,CPU使用率低。
1. 通过top
命令查看CPU等待IO时间,即%wa
;
2. 通过iostat -d -x -m 1 10
查看磁盘IO情况;(安装命令 yum install -y sysstat
)
3. 通过sar -n DEV 1 10
查看网络IO情况;
4. 通过如下命令查找占用IO的程序
ps -e -L h o state,cmd | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr
根据特定条件查看进程PID信息——pgrep
基本命令格式
pgrep <选项> <参数>
常见选项及含义
选项 | 含义 |
---|---|
-l | 显示进程名,缺省时只输出PID号 |
-U | 指定特定用户 |
-t | 指定终端 |
基本使用方式
[root@host ~]# pgrep -l "log"
299 xfs-log/sda2
605 systemd-logind
613 abrt-watch-log
616 abrt-watch-log
1046 rsyslogd
以树形结构列出进程信息——pstree
基本命令格式
pstree [选项] [参数]
pstree
常用选项及含义
选项 | 含义 |
---|---|
-a | 显示完整信息 |
-u | 列出对应的用户名 |
-p | 列出对应PID号 |
基本使用方式
查看所有进程的信息
[root@host ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]├─NetworkManager───2*[{NetworkManager}]├─VGAuthService├─2*[abrt-watch-log]├─abrtd├─accounts-daemon───2*[{accounts-daemon}]├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}│ └─3*[{at-spi-bus-laun}]├─at-spi2-registr───2*[{at-spi2-registr}]├─atd├─auditd─┬─audispd─┬─sedispatch│ │ └─{audispd}│ └─{auditd}├─avahi-daemon───avahi-daemon├─boltd───2*[{boltd}]├─chronyd├─colord───2*[{colord}]├─crond├─cupsd├─2*[dbus-daemon───{dbus-daemon}]├─dbus-launch├─dnsmasq───dnsmasq├─firewalld───{firewalld}├─gdm─┬─X───3*[{X}]│ ├─gdm-session-wor─┬─gnome-session-b─┬─gnome-shell─┬─ibus-daem+│ │ │ │ └─14*[{gnom+│ │ │ ├─gsd-a11y-settin───3*[{g+│ │ │ ├─gsd-clipboard───2*[{gsd+│ │ │ ├─gsd-color───3*[{gsd-col+│ │ │ ├─gsd-datetime───2*[{gsd-+│ │ │ ├─gsd-housekeepin───2*[{g+│ │ │ ├─gsd-keyboard───3*[{gsd-+│ │ │ ├─gsd-media-keys───3*[{gs+│ │ │ ├─gsd-mouse───2*[{gsd-mou+│ │ │ ├─gsd-power───3*[{gsd-pow+│ │ │ ├─gsd-print-notif───2*[{g+│ │ │ ├─gsd-rfkill───2*[{gsd-rf+│ │ │ ├─gsd-screensaver───2*[{g+│ │ │ ├─gsd-sharing───3*[{gsd-s+│ │ │ ├─gsd-smartcard───4*[{gsd+│ │ │ ├─gsd-sound───3*[{gsd-sou+│ │ │ ├─gsd-wacom───2*[{gsd-wac+│ │ │ ├─gsd-xsettings───3*[{gsd+│ │ │ └─3*[{gnome-session-b}]│ │ └─2*[{gdm-session-wor}]│ └─3*[{gdm}]├─gssproxy───5*[{gssproxy}]├─ibus-portal───2*[{ibus-portal}]├─ibus-x11───2*[{ibus-x11}]├─irqbalance├─ksmtuned───sleep├─libvirtd───16*[{libvirtd}]├─lsmd├─lvmetad├─master─┬─pickup│ └─qmgr├─packagekitd───2*[{packagekitd}]├─polkitd───6*[{polkitd}]├─pulseaudio───{pulseaudio}├─rngd├─rpcbind├─rsyslogd───2*[{rsyslogd}]├─rtkit-daemon───2*[{rtkit-daemon}]├─smartd├─sshd───sshd───bash───pstree├─systemd-journal├─systemd-logind├─systemd-udevd├─tuned───4*[{tuned}]├─udisksd───4*[{udisksd}]├─upowerd───2*[{upowerd}]├─vmtoolsd───2*[{vmtoolsd}]├─wpa_supplicant└─xdg-permission-───2*[{xdg-permission-}]
查看所有进程的完整信息(PID号、用户名、完整命令)
[root@host ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 22├─ModemManager,578│ ├─{ModemManager},595│ └─{ModemManager},686├─NetworkManager,729 --no-daemon│ ├─{NetworkManager},737│ └─{NetworkManager},739├─VGAuthService,603 -s├─abrt-watch-log,613 -F BUG: WARNING: at WARNING: CPU:INFO: possible rec├─abrt-watch-log,616 -F Backtrace /var/log/Xorg.0.log --/usr/bin/abrt-du├─abrtd,611 -d -s├─accounts-daemon,580│ ├─{accounts-daemon},589│ └─{accounts-daemon},685├─at-spi-bus-laun,1741,gdm│ ├─dbus-daemon,1746...│ │ └─{dbus-daemon},1749│ ├─{at-spi-bus-laun},1742│ ├─{at-spi-bus-laun},1743│ └─{at-spi-bus-laun},1745├─at-spi2-registr,1752,gdm --use-gnome-session│ ├─{at-spi2-registr},1754│ └─{at-spi2-registr},1757├─atd,1057 -f├─auditd,553│ ├─audispd,555│ │ ├─sedispatch,557│ │ └─{audispd},558│ └─{auditd},554├─avahi-daemon,607,avahi│ └─avahi-daemon,632├─boltd,1859│ ├─{boltd},1863│ └─{boltd},1866├─chronyd,622,chrony├─colord,1949,colord│ ├─{colord},1960│ └─{colord},1962├─crond,1058 -n├─cupsd,1044 -f├─dbus-daemon,1716,gdm --fork --print-pid 5 --print-address 7 ...│ └─{dbus-daemon},1717├─dbus-daemon,617,dbus --system --address=systemd: --nofork ...│ └─{dbus-daemon},684├─dbus-launch,1707,gdm --exit-with-session ...├─dnsmasq,1638,nobody ...│ └─dnsmasq,1641,root ...├─firewalld,705 -Es /usr/sbin/firewalld --nofork --nopid│ └─{firewalld},857├─gdm,1059│ ├─X,1409 :0 -background none -noreset -audit 4 -verbose -auth...│ │ ├─{X},1680│ │ ├─{X},1681│ │ └─{X},1687│ ├─gdm-session-wor,1695│ │ ├─gnome-session-b,1699,gdm --autostart...│ │ │ ├─gnome-shell,1799│ │ │ │ ├─ibus-daemon,1831 --xim --panel disable│ │ │ │ │ ├─ibus-dconf,1834│ │ │ │ │ │ ├─{ibus-dconf},1839│ │ │ │ │ │ ├─{ibus-dconf},1842│ │ │ │ │ │ └─{ibus-dconf},1843│ │ │ │ │ ├─ibus-engine-sim,1977│ │ │ │ │ │ ├─{ibus-engine-sim},1979│ │ │ │ │ │ └─{ibus-engine-sim},1980│ │ │ │ │ ├─{ibus-daemon},1832│ │ │ │ │ └─{ibus-daemon},1835│ │ │ │ ├─{gnome-shell},1802│ │ │ │ ├─{gnome-shell},1803│ │ │ │ ├─{gnome-shell},1804│ │ │ │ ├─{gnome-shell},1811│ │ │ │ ├─{gnome-shell},1812│ │ │ │ ├─{gnome-shell},1820│ │ │ │ ├─{gnome-shell},1821│ │ │ │ ├─{gnome-shell},1822│ │ │ │ ├─{gnome-shell},1823│ │ │ │ ├─{gnome-shell},1824│ │ │ │ ├─{gnome-shell},1825│ │ │ │ ├─{gnome-shell},1826│ │ │ │ ├─{gnome-shell},1827│ │ │ │ └─{gnome-shell},1828│ │ │ ├─gsd-a11y-settin,1872│ │ │ │ ├─{gsd-a11y-settin},1876│ │ │ │ ├─{gsd-a11y-settin},1877│ │ │ │ └─{gsd-a11y-settin},1934│ │ │ ├─gsd-clipboard,1874│ │ │ │ ├─{gsd-clipboard},1880│ │ │ │ └─{gsd-clipboard},1881│ │ │ ├─gsd-color,1875│ │ │ │ ├─{gsd-color},1893│ │ │ │ ├─{gsd-color},1894│ │ │ │ └─{gsd-color},1895│ │ │ ├─gsd-datetime,1882│ │ │ │ ├─{gsd-datetime},1891│ │ │ │ └─{gsd-datetime},1892│ │ │ ├─gsd-housekeepin,1885│ │ │ │ ├─{gsd-housekeepin},1887│ │ │ │ └─{gsd-housekeepin},1890│ │ │ ├─gsd-keyboard,1889│ │ │ │ ├─{gsd-keyboard},1898│ │ │ │ ├─{gsd-keyboard},1899│ │ │ │ └─{gsd-keyboard},1900│ │ │ ├─gsd-media-keys,1896│ │ │ │ ├─{gsd-media-keys},1941│ │ │ │ ├─{gsd-media-keys},1942│ │ │ │ └─{gsd-media-keys},1946│ │ │ ├─gsd-mouse,1897│ │ │ │ ├─{gsd-mouse},1901│ │ │ │ └─{gsd-mouse},1903│ │ │ ├─gsd-power,1902│ │ │ │ ├─{gsd-power},1906│ │ │ │ ├─{gsd-power},1908│ │ │ │ └─{gsd-power},1936│ │ │ ├─gsd-print-notif,1904│ │ │ │ ├─{gsd-print-notif},1905│ │ │ │ └─{gsd-print-notif},1910│ │ │ ├─gsd-rfkill,1909│ │ │ │ ├─{gsd-rfkill},1912│ │ │ │ └─{gsd-rfkill},1916│ │ │ ├─gsd-screensaver,1911│ │ │ │ ├─{gsd-screensaver},1914│ │ │ │ └─{gsd-screensaver},1917│ │ │ ├─gsd-sharing,1913│ │ │ │ ├─{gsd-sharing},1919│ │ │ │ ├─{gsd-sharing},1920│ │ │ │ └─{gsd-sharing},1922│ │ │ ├─gsd-smartcard,1918│ │ │ │ ├─{gsd-smartcard},1921│ │ │ │ ├─{gsd-smartcard},1924│ │ │ │ ├─{gsd-smartcard},1932│ │ │ │ └─{gsd-smartcard},1963│ │ │ ├─gsd-sound,1923│ │ │ │ ├─{gsd-sound},1926│ │ │ │ ├─{gsd-sound},1927│ │ │ │ └─{gsd-sound},1931│ │ │ ├─gsd-wacom,1925│ │ │ │ ├─{gsd-wacom},1938│ │ │ │ └─{gsd-wacom},1939│ │ │ ├─gsd-xsettings,1869│ │ │ │ ├─{gsd-xsettings},1878│ │ │ │ ├─{gsd-xsettings},1879│ │ │ │ └─{gsd-xsettings},1935│ │ │ ├─{gnome-session-b},1764│ │ │ ├─{gnome-session-b},1765│ │ │ └─{gnome-session-b},1781│ │ ├─{gdm-session-wor},1696│ │ └─{gdm-session-wor},1697│ ├─{gdm},1152│ ├─{gdm},1153│ └─{gdm},1408├─gssproxy,631 -D│ ├─{gssproxy},633│ ├─{gssproxy},634│ ├─{gssproxy},635│ ├─{gssproxy},636│ └─{gssproxy},637├─ibus-portal,1841,gdm│ ├─{ibus-portal},1844│ └─{ibus-portal},1845├─ibus-x11,1837,gdm --kill-daemon│ ├─{ibus-x11},1846│ └─{ibus-x11},1847├─irqbalance,610 --foreground├─ksmtuned,701 /usr/sbin/ksmtuned│ └─sleep,4360 60├─libvirtd,1051│ ├─{libvirtd},1199│ ├─{libvirtd},1200│ ├─{libvirtd},1201│ ├─{libvirtd},1202│ ├─{libvirtd},1203│ ├─{libvirtd},1204│ ├─{libvirtd},1205│ ├─{libvirtd},1206│ ├─{libvirtd},1207│ ├─{libvirtd},1208│ ├─{libvirtd},1414│ ├─{libvirtd},1415│ ├─{libvirtd},1416│ ├─{libvirtd},1417│ ├─{libvirtd},1418│ └─{libvirtd},1457├─lsmd,602,libstoragemgmt -d├─lvmetad,415 -f├─master,1359 -w│ ├─pickup,3407,postfix -l -t unix -u│ └─qmgr,1384,postfix -l -t unix -u├─packagekitd,1871│ ├─{packagekitd},1883│ └─{packagekitd},1884├─polkitd,582,polkitd --no-debug│ ├─{polkitd},638│ ├─{polkitd},687│ ├─{polkitd},689│ ├─{polkitd},696│ ├─{polkitd},697│ └─{polkitd},700├─pulseaudio,1816,gdm --start --log-target=syslog│ └─{pulseaudio},1819├─rngd,601 -f├─rpcbind,585,rpc -w├─rsyslogd,1046 -n│ ├─{rsyslogd},1082│ └─{rsyslogd},1118├─rtkit-daemon,593,rtkit│ ├─{rtkit-daemon},690│ └─{rtkit-daemon},691├─smartd,606 -n -q never├─sshd,1042 -D│ └─sshd,3780│ └─bash,3788│ └─pstree,4361 -aup├─systemd-journal,386├─systemd-logind,605├─systemd-udevd,428├─tuned,1043 -Es /usr/sbin/tuned -l -P│ ├─{tuned},1403│ ├─{tuned},1404│ ├─{tuned},1406│ └─{tuned},1407├─udisksd,609│ ├─{udisksd},629│ ├─{udisksd},688│ ├─{udisksd},706│ └─{udisksd},723├─upowerd,1807│ ├─{upowerd},1808│ └─{upowerd},1809├─vmtoolsd,604│ ├─{vmtoolsd},639│ └─{vmtoolsd},645├─wpa_supplicant,1870 -u -f /var/log/wpa_supplicant.log -c/etc/wpa_suppl└─xdg-permission-,1850,gdm├─{xdg-permission-},1851└─{xdg-permission-},1853
查询指定用户的进程
[root@host ~]# pstree -aup test
bash,4780
三、进程的启动与控制
1、手动启动
- 前台启动:用户输入命令,直接执行的程序;
- 后台启动:在命令行尾加入“&”符号
当使用cp
命令从光盘中制作镜像文件时,由于需要复制的数据较多,耗时较长,因此可结合“&”符号将复制操作放到后台运行,以便用户可以继续执行其他命令操作
[root@host ~]#cp -r /dev/sr0 /opt &
nohup命令——终端关闭后任务依旧启动
nohup 英文全称 no hang up(不挂起),用于在系统后台不中断地运行命令,退出终端不会影响程序的运行。
nohup的特点
- nohup命令,在默认情况下(非重定向时),会输出一个名叫
nohup.out
的文件到当前目录下 - 如果当前目录的
nohup.out
文件不可写,输出重定向到$HOME/nohup.out
文件中。 - 一般和
&
后台符,结合使用。 - 记住一个标准用法
no
基本命令格式
//在当前终端前台中工作
nohup [命令与参数]//在当前终端后台中工作
nohup [命令与参数] &
基本使用方式
前台运行程序或命令,停止进程
//运行ping命令在前台
[root@host opt]# nohup ping www.baidu.com
nohup: 忽略输入并把输出追加到"nohup.out"
^C
[root@host opt]# //查看当前目录下生成了一个nohup.out文件
[root@host opt]# ll
总用量 4
-rw-------. 1 root root 1395 4月 12 22:57 nohup.out
drwxr-xr-x. 2 root root 6 10月 31 2018 rh//查看nohup.out文件内容,在nohup命令下方Ctrl+C停止ping命令,nohup.out文件内容停止更新
[root@host opt]# tail -f nohup.out
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=3 ttl=128 time=4.21 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=4 ttl=128 time=4.02 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=5 ttl=128 time=4.03 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=6 ttl=128 time=3.67 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=7 ttl=128 time=3.86 ms--- www.baidu.com ping statistics ---
18 packets transmitted, 5 received, 0% packet loss, time 26046ms
rtt min/avg/max/mdev = 3.544/5.022/18.818/3.403 ms
后台运行程序或命令,停止进程
//查看当前目录下文件
[root@host opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
//运行ping命令在后台
[root@host opt]# nohup ping www.baidu.com &
[1] 3573
[root@host opt]# nohup: 忽略输入并把输出追加到"nohup.out"//退出当前终端
[root@host opt]# logout//重新连接终端后查看正在执行的进程
[root@host ~]# ps aux | grep ping
root 2377 0.0 0.1 463712 4172 ? Sl 22:53 0:00 /usr/libexec/gsd-housekeeping
root 3573 0.0 0.0 150088 1992 ? S 23:07 0:00 ping www.baidu.com
root 3624 0.0 0.0 112828 972 pts/2 S+ 23:07 0:00 grep --color=auto ping//进入/opt目录查看nohup.out命令结果输出情况
[root@host ~]# cd /opt/
[root@host opt]# tail -f nohup.out
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=41 ttl=128 time=4.41 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=42 ttl=128 time=4.83 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=43 ttl=128 time=4.06 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=44 ttl=128 time=4.71 ms
^C
//杀掉对用ping命令的进程
[root@host opt]# kill 3573
//查看ping命令进程,已经被杀掉了
[root@host opt]# ps aux | grep ping
root 2377 0.0 0.1 463712 4172 ? Sl 22:53 0:00 /usr/libexec/gsd-housekeeping
root 3674 0.0 0.0 112828 976 pts/2 S+ 23:10 0:00 grep --color=auto ping
//查看nohup.out命令结果输出已经停止
[root@host opt]# tail -f nohup.out
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=158 ttl=128 time=4.57 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=159 ttl=128 time=4.78 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=160 ttl=128 time=5.54 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=161 ttl=128 time=4.66 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=162 ttl=128 time=4.07 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=163 ttl=128 time=4.53 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=164 ttl=128 time=4.52 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=165 ttl=128 time=4.48 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=166 ttl=128 time=6.27 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=167 ttl=128 time=5.16 ms
2、进程的前后台调度
Ctrl + Z 组合键
将当前进程挂起,即调入后台并停止执行
[root@host ~]# vim 1.txt[1]+ 已停止 vim 1.txt
注意:要把光标放在输入的字符中间,否则可能会自动复制光标前字符并占满整个文件。
jobs命令
查看处于后台的任务列表
[root@host ~]# jobs -l
[1]+ 4968 停止 vim 1.txt
fg命令
将后台进程恢复到前台运行,可指定任务序列号
[root@host ~]fg 1
2323
abc
3、终止程序的运行
Ctrl + C组合键
中断正在执行的命令
[root@host ~]# ping www.baidu.com
PING www.baidu.com (36.152.44.95) 56(84) bytes of data.
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=1 ttl=128 time=4.33 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=2 ttl=128 time=4.54 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=3 ttl=128 time=4.22 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=4 ttl=128 time=4.32 ms
^C
--- www.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 12057ms
rtt min/avg/max/mdev = 4.222/4.355/4.541/0.141 ms
kill命令
kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。kill命令可以概括为用于终止指定PID号的进程的命令。
基本命令格式
kill [-n] -s <信号名> <PID>
-n
:选择发送指定的信号给进程,n为信号数,默认15
-s
:选择发送指定的信号给进程,参数为信号数对应的信号名,默认为SIGTERN
PID
:杀死指定PID的进程
kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。
常用的信号选项
Linux 定义了几十种不同类型的信号,可以使用 kill -l
命令查看所有信号及其编号,这里仅列出几个常用的信号。
信号 | 信号名 | 说明 |
---|---|---|
-1 | SIGHUP | 重新加载某个进程重新加载某个进程 |
-3 | SIGQUIT | 告诉进程保存日志后关闭退出 |
-9 | SIGKILL | 表示进程被终止,需要立即退出(不可被捕获也不能被忽略) |
-15 | SIGTERM | 告诉进程你需要被关闭,请自行停止运行并退出(可被捕获也能被忽略) |
默认情况下kill
命令使用的是信号15
基本使用方式
//启动RPM包默认安装的apache服务
[root@host ~]# service httpd start
Redirecting to /bin/systemctl start httpd.service
//查看 httpd 的进程树及 PID。
//grep 命令査看 httpd 也会生成包含"httpd"关键字的进程,所以使用“-v”反向选择包含“grep”关键字的进程。
//这里使用 pstree 命令来查询进程,当然也可以使用 ps 和 top 命令
[root@host ~]# pstree -p | grep httpd | grep -v "grep"|-httpd(6764)-+-httpd(6781)| |-httpd(6782)| |-httpd(6783)| |-httpd(6786)| `-httpd(6787)
//杀死PID是6781的httpd进程,默认信号是15,正常停止
[root@host ~]# kill 6781
[root@host ~]# pstree -p | grep httpd | grep -v "grep"|-httpd(6764)-+-httpd(6782)| |-httpd(6783)| |-httpd(6786)| |-httpd(6787)| `-httpd(6940)
kill、kill -9的区别
首先两个指令都是杀死进行的效果。
执行kill
命令,系统会发送一个sigterm信号给对应的程序,当程序收到该sigterm信号后,有以下几种情况:1.程序立即停止;2.程序释放资源后在停止;3.程序可能继续运行。大部分情况下收到信号之后,会先释放自己的资源,然后在停止,但是也有可能收到信号之后,做一些其他事情(如果程序正在等待io,可能就马上做出相应),也就是说,sigterm多半会被阻塞。
kill -9
命令,系统给对应的应用程序发送一个sigterm以及exit,exit信号不会阻塞。所以kill -9 能够顺利杀掉进程。
killall命令
killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,即用于终止指定名称相关的所有进程。也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。
基本命令格式
kill <进程名>
基本使用方式
//启动RPM包默认安装的apache服务
[root@host ~]# service httpd start
Redirecting to /bin/systemctl start httpd.service
//查看httpd进程
[root@host ~]# pstree -p | grep httpd | grep -v "grep"|-httpd(7088)-+-httpd(7091)| |-httpd(7092)| |-httpd(7093)| |-httpd(7094)| `-httpd(7095)
//杀死所有进程名是httpd的进程
[root@host ~]# killall httpd
//查询发现所有的httpd进程都消失了
[root@host ~]# pstree -p | grep httpd | grep -v "grep"
pkill命令
当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程。
基本命令格式
pkill -U <用户名>
pkill -t <进程名>
pkill <关键词>
常用命令选项及含义
选项 | 含义 |
---|---|
-U | 根据进程所属的用户名终止相应进程 |
-t | 根据进程所在的终端终止相应进程 |
关键词 | 根据关键词关闭所有带关键词的进程 |
基本使用方式
[root@host ~]# pgrep -l -U 'test'
7257 bash
7304 vim
[root@host ~]# pkill -9 -U 'test'
[root@host ~]# pgrep -l -U 'test'
查询终端方式
who命令、w命令、ps aux命令
四、计划任务管理
设置一次性计划任务——at命令
基本命令格式
at [HH:MM] [yyyy-mm-dd]
Ctrl+D提交任务
基本使用方式
//设置计划任务
[root@host ~]# at 23:24 2023-04-11
at> echo 'hello world' > /opt/1.txt
at> <EOT>
job 3 at Tue Apr 11 23:24:00 2023
//查看未执行的任务列表
[root@host ~]# atq
3 Tue Apr 11 23:24:00 2023 a root
//查看文件任务是否完成
[root@host ~]# cat /opt/1.txt
hello world//设置计划任务
[root@host ~]# at 23:27 2023-04-11
at> echo 'wao' > /opt/1.txt
at> <EOT>
job 7 at Tue Apr 11 23:27:00 2023
//查看未执行的任务列表
[root@host ~]# atq
7 Tue Apr 11 23:27:00 2023 a root
//删除第7条任务
[root@host ~]# atrm 7
//查看未执行的任务列表
[root@host ~]# atq
设置周期性计划任务——crontab命令
crontab命令用于设置周期性的计划任务,按照预先设置的时间周期(分钟、小时、天、周)重复执行用户指定的命令操作。
基本命令格式语法
crontab [-u 用户名] [选项]
常用选项及含义
选项 | 含义 |
---|---|
-u | 可指定用户,缺省时为针对当前用户 |
-e | 编辑计划任务的内容 |
-l | 查看计划任务的内容 |
-r | 删除计划任务 |
crontab会读取的配置文件
1. /etc/crontab
:位于文件。只有root用户能编辑,一般不会改动,默认每天,每周,每月,去执行/etc/cron.daily
,/etc/cron.hourly
, /etc/cron.monthly
下的所有可执行文件。
2. /etc/cron.d
: 位于目录。只有root用户能编辑,当一个项目有自己的定时脚本时,将编辑好的cron文件放入这个目录下即可生效。
3. /var/spool/cron :位于文件。使用crontab -e
编辑就是这个目录下的cron文件,文件名是用户名,所有用户都能在这个目录下编辑自己的cron文件。
crontab的应用命令
vim /var/spool/cron/用户同名文件echo '* * * * * /usr/bin/ls' >> /var/spool/cron/用户同名文件
crontab的格式讲解
50 3 2 1 * run_commad
每项工作 (每行) 的格式都是具有六个栏位,这六个栏位的意义为:
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
---|---|---|---|---|---|---|
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 要执行的命令或程序脚本 |
注意:周的数字为 0 或 7 时都代表星期天,数字范围取得都是整数。
特殊字符 | 代表意义 |
---|---|
*(星号) | 表示该范围内的任意时间 |
,(逗号) | 表示间隔的多个不连续时间点 |
-(减号) | 表示一个连续的时间范围 |
/n(斜线) | 指定间隔的时间频率 |
时间周期设置 任务内容设置 命令一定要用绝对路径,例如cp命令,要用/usr/bin/cp,可以用which查看命令的绝对路径。
常见应用示例
//周—到周五每天17点
0 17 * * 1-5//周一,周三,周五8.30
30 8 * * 1,3,5//8点到18点每两小时
0 8-18/2 * * *//每三天
0 * */3 * *
基本使用方式
//vim编辑器添加任务
[root@host ~]# vim /var/spool/cron/root
* * * * * /usr/bin/ls//crontab命令编辑任务
[root@host ~]# crontab -e
crontab: installing new crontab
您在 /var/spool/mail/root 中有新邮件
* * * * * /usr/bin/ls
* * * * * /usr/bin/cp//echo命令添加任务
[root@host ~]# echo '* * * * * /usr/bin/grep' >> /var/spool/cron/root
您在 /var/spool/mail/root 中有新邮件//crontab命令查看任务
[root@host ~]# crontab -l
* * * * * /usr/bin/ls
* * * * * /usr/bin/cp
* * * * * /usr/bin/grep
您在 /var/spool/mail/root 中有新邮件//crontab命令删除任务
[root@host ~]# crontab -r
[root@host ~]# crontab -l
no crontab for root