【Linux】进程和计划任务管理


一、线程、进程、程序的概念

什么是程序?

  程序是保存在硬盘、光盘等介质中的可执行代码和数据,它是在文件中静态保存的代码。通常可以理解为程序员写的代码,代码保存在文件中,存储在硬盘里面。

什么是线程?

  线程是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 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
...

默认情况下每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使用率升高,因为进程启动结束时间较短,所以toppidstat不容易发现;
  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 命令查看所有信号及其编号,这里仅列出几个常用的信号。

信号信号名说明
-1SIGHUP重新加载某个进程重新加载某个进程
-3SIGQUIT告诉进程保存日志后关闭退出
-9SIGKILL表示进程被终止,需要立即退出(不可被捕获也不能被忽略)
-15SIGTERM告诉进程你需要被关闭,请自行停止运行并退出(可被捕获也能被忽略)

默认情况下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-590-231-311-120-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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的宝贝大唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值