Linux系统管理:进程和计划任务管理

前言:

在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 [命令]来查找此命令的绝对路径。

发布了48 篇原创文章 · 获赞 46 · 访问量 6627

猜你喜欢

转载自blog.csdn.net/weixin_45726050/article/details/103040614