如何查看linux后台进程?怎么创建后台任务?看这里

一:进程概述

1.1 什么是进程

要知道什么是进程,就要先知道程序是什么。简单来说,程序就是一系列可执行的代码。而当那一串代码被执行,即程序被运行,其所产生的就叫进程,一个程序可以创建一个或多个进程。简单说,进程就是动态执行的代码。是资源分配的最小单位

1.2 进程的分类

Linux 中 根据进程的特点,把进程可以分为三类:交互进程、批处理进程和守护进程。

(1) 交互进程:是由shell启动的进程,它既可以在前台运行,也可以在后台运行。

(2)批处理进程:和终端没有联系,是一个进程序列。该进程负责按照顺序启动其它进程。

(3)守护进程:是是执行特定功能或者执行系统相关任务的后台进程。

  • 根据进程状态,可以分为 守护进程,孤儿进程,僵尸进程

  • (1)守护进程:没有控制终端,父进程都是init进程(PID为1)

  • (2)孤儿进程:父进程退出后,其子进程还在运行,这些子进程成为孤儿进程。孤儿进程将会被init(PID=1) 进程收养,有init进程对他们完成状态收集工作

  • (3)僵尸进程:当子进程比父进程先结束时,却又没有完全释放内存,该进程就成为僵尸进程。僵尸进程父进程结束后,僵尸进程就会被init进程收养,最终回收。

#孤儿进程不会导致资源浪费,但是,僵尸进程会导致资源浪费。

1.3 Linux 的 5中常见进程状态

linux有 5 中常见进程状态 运行 , 中断 ,不可中断 , 僵死, 停止

在这里插入图片描述

X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。当进程在退出过程中,没有保留它的 task_struct ,此时就处于EXIT_DEAD。此状态非常短暂,几乎不可能被ps 命令捕捉

二: 统计进程信息

2.1 ps 命令 查看静态的进程统计信息

(1) ps aux

常用选项

a : 显示中断上的所有进程,包括其他用户的进程

u :列出进程的用户

x :显示所有终端的进程
在这里插入图片描述
字段解释:

USER : 启动进程的用户

PID : 进程的ID

%CPU : 进程占用的cpu 百分比

%MEM: 进程占用的内存百分比

VSZ : 进程占用的虚拟内存(KB)

RSS : 进程占用的物理内存(KB)

TTY : 启动进程的终端。不是从终端启动的则为?

STAT : 进程的状态。
(D :不可中断睡眠状态 ,S:可中断睡眠状态 ,R:可执行/运行状态 ,Z :僵死状态 ,T :停止转态或者追踪状态)

START: 进程被触发时间

TIME : 该进程实际使用cpu时间

COMMAND : 进程的启动命令

(2) ps -elf

-e :显示系统内的所有进程新型

-l : 长格式显示进程信息

-f : 使用完整的格式显示进程信息

-a : 显示所有进程的pid

-T : 查看线程的信息

#如果要查看线程的信息,可以使用 ps -aT 命令

在这里插入图片描述

字段解释:

F :内核分配给进程的系统标记

S : 进程的状态

UID : 启动进程的用户

PID :进程ID

PPID : 进程的父进程ID

C :进程生命周期的cpu利用率

PRI : 进程的优先级(数字越大,优先级越低)

NI : 谦让度值,用来参与决定优先级

ADDR :进程的内存地址

SZ : 所需交换空间大小

WCHAN :如果该进程睡眠,显示睡眠中的系统函数名

STIME :进程启动时的系统时间

TTY : 进程启动时的终端设备

TIME :进程占用的累计CPU时间

CMD :进程的启动命令

2.2 top 命令动态查看进程排名信息

top 命令 会进入一个交互界面,按下ctrl +c 或者 q 键 退出
在这里插入图片描述
第一行是:任务队列信息

10:40:49 ##系统时间
up 2:03 ##系统运行时长
1 user ##当前登录用户数
load average: 0.00 ,0.01 ,0.02
##系统负载,依次是 1分钟内,5分钟内,15 分钟内 到现在的平均值。一般该值最好小于 CPU总核心数*0.7

第二行:进程信息

Tasks #总进程数
running #正在运行的进程数
sleeping #休眠的进程数
stopped #中止的进程数
zombie #僵死的进程数

第三行:Cpu 信息 (显示的是所有cpu总和的信息。按 1 键,可以看到每个cpu的信息,按大写P 键可以按cpu 使用的降序排列)

us ##用户占用
sy ##系统占用
ni ##优先级调度占用
id ## 空闲cpu 占比
wa ## I/O 读写等待占用
hi ##硬件中断占用
si ##软件中断占用
st ##虚拟化占用

第四行: 内存的信息( 按下大写M ,根据使用内存大小 进行 降序排列)

total ##总内存空间
free ##空闲内存
used ##已使用内存
buff/cache ##物理内存和交换内存缓存区总和

第五行: 交换空间信息

total ##总交换空间大小
free ##空闲交换空间
used ##已使用交换空间
avail Mem ##可用物理内存大小

进程信息区各列解释

PID     #进程id
USER    #启动进程的用户
PR #优先级
NI #谦让度
RES #进程使用的虚拟内存总量(kb)
SHR #共享内存大小 (kb)
S #进程状态
%CPU #上次更新到现在cpu使用占比
%MEM #内存使用占比
TIME+ #进程使用的cpu时间总计,精确到 毫秒
COMMAND #启动进程的命令

top 交互界面常用操作

P 键: 根据CPU 降序排列

M 键:根据内存降序排列

N 键: 根据启动时间降序排列

c 键: 切换显示命令名称和完整命令行

h 键:可以获得top 程序的帮助信息

k 键: 根据提示输入进程的pid 号,按enter 键, 可以 终止 对应的进程

q 键: 退出top 交互界面

数字1 键: 显示 每个cpu 的状态

top -H : 显示所有线程

top -H -p : 显示特定进程中的线程

2.3 pgrep 查看特定进程信息

pgrep -l 显示进程名。如果没有,只显示PID号

其他选项:
-U : 指定特定用户
-G :指定特定组
-t :指定终端
-a : 列出完整的命令行

[root@localhost ~]# pgrep -l httpd        #列出httpd 的进程
4284 httpd
4286 httpd
4287 httpd
4288 httpd
4289 httpd
4290 httpd


[root@localhost ~]# pgrep -l -U test     #列出test 用户的进程,并显示进程名
4331 bash
4370 top
[root@localhost ~]# pgrep -l -G root     #列出 root 组 的进程,并显示进程名
1 systemd
2 kthreadd
3 ksoftirqd/0
5 kworker/0:0H
6 kworker/u256:0
[root@localhost ~]# pgrep -l -t pts/2    #列出 终端pts/2 的进程
5192 bash
5291 top
[root@localhost ~]# pgrep -l -a httpd    #列出httpd 进程的命令
4284 /usr/sbin/httpd -DFOREGROUND
4286 /usr/sbin/httpd -DFOREGROUND
4287 /usr/sbin/httpd -DFOREGROUND
4288 /usr/sbin/httpd -DFOREGROUND
4289 /usr/sbin/httpd -DFOREGROUND
4290 /usr/sbin/httpd -DFOREGROUND

2.4 pstree 查看进程树

pstree 以树形结构列出进程信息

pstree 【选项】 【用户名】

选项

-a : 显示完整信息

-u : 列出对应用户名

-p : 列出对应的PID名

[root@caoyuzhou ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,735
  │   ├─{ModemManager},757
  │   └─{ModemManager},797
  ├─NetworkManager,841 --no-daemon
  │   ├─{NetworkManager},852
  │   └─{NetworkManager},857
  ├─VGAuthService,749 -s
  ├─abrt-watch-log,743 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BUG 
  ├─abrt-watch-log,751 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
  ├─abrtd,740 -d -s
  ├─accounts-daemon,736
  │   ├─{accounts-daemon},756
  │   └─{accounts-daemon},798
  ├─alsactl,805 -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00mainrdae
  ├─at-spi-bus-laun,1653,gdm
  │   ├─dbus-daemon,1658 --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork ...
  │   │   └─{dbus-daemon},1659
  │   ├─{at-spi-bus-laun},1654
  │   ├─{at-spi-bus-laun},1655
  │   └─{at-spi-bus-laun},1657
  ├─at-spi2-registr,1661,gdm --use-gnome-session
  │   ├─{at-spi2-registr},1663
  │   └─{at-spi2-registr},1664
  ├─atd,1177 -f
  ├─auditd,710
  │   ├─audispd,712
  │   │   ├─sedispatch,714
  │   │   └─{audispd},715
  │   └─{auditd},711
  ├─avahi-daemon,758,avahi
  │   └─avahi-daemon,775
  ├─bluetoothd,747
  ├─chronyd,785,chrony
  ├─colord,1763,colord
  │   ├─{colord},1769
  │   └─{colord},1771
  ├─crond,1174 -n
  ├─cupsd,1149 -f
  ├─dbus-daemon,1645,gdm --fork --print-pid 4 --print-address 6 --session
  │   └─{dbus-daemon},1646
  ├─dbus-daemon,765,dbus --system --address=systemd: --nofork --nopidfile --systemd-activation
  │   └─{dbus-daemon},793
  ├─dbus-launch,1644,gdm --exit-with-session /usr/libexec/gnome-session-binary --autostart...
  ├─dnsmasq,1506,nobody --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro...
  │   └─dnsmasq,1507,root --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro...
  ├─firewalld,839 -Es /usr/sbin/firewalld --nofork --nopid
  │   └─{firewalld},960
  ├─gdm,1173
  │   ├─X,1618 :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-EF5JFn/database ...
  │   │  ├─{X},1620
  │   │  ├─{X},1621
  │   │  ├─{X},1622
  │   │  ├─{X},1623
  │   │  └─{X},1626
  │   ├─gdm-session-wor,1634
  │   │   ├─gnome-session-b,1638,gdm --autostart /usr/share/gdm/greeter/autostart
  │   │   │   ├─gnome-settings-,1750
  │   │   │   │   ├─{gnome-settings-},1754
  │   │   │   │   ├─{gnome-settings-},1756
  │   │   │   │   ├─{gnome-settings-},1757
  │   │   │   │   └─{gnome-settings-},1765
  │   │   │   ├─gnome-shell,1673
  │   │   │   │   ├─ibus-daemon,1718 --xim --panel disable
  │   │   │   │   │   ├─ibus-dconf,1722
  │   │   │   │   │   │   ├─{ibus-dconf},1726
  │   │   │   │   │   │   ├─{ibus-dconf},1728
  │   │   │   │   │   │   └─{ibus-dconf},1729
  │   │   │   │   │   ├─ibus-engine-sim,1783
  │   │   │   │   │   │   ├─{ibus-engine-sim},1784
  │   │   │   │   │   │   └─{ibus-engine-sim},1785
  │   │   │   │   │   ├─{ibus-daemon},1720
  │   │   │   │   │   └─{ibus-daemon},1723
  │   │   │   │   ├─{gnome-shell},1675
  │   │   │   │   ├─{gnome-shell},1676
  │   │   │   │   ├─{gnome-shell},1677
  │   │   │   │   ├─{gnome-shell},1678
  │   │   │   │   ├─{gnome-shell},1679
  │   │   │   │   ├─{gnome-shell},1681
  │   │   │   │   ├─{gnome-shell},1697
  │   │   │   │   ├─{gnome-shell},1705
  │   │   │   │   ├─{gnome-shell},1706
  │   │   │   │   ├─{gnome-shell},1707
  │   │   │   │   ├─{gnome-shell},1708
  │   │   │   │   ├─{gnome-shell},1709
  │   │   │   │   ├─{gnome-shell},1710
  │   │   │   │   └─{gnome-shell},1711
  │   │   │   ├─{gnome-session-b},1669
  │   │   │   ├─{gnome-session-b},1670
  │   │   │   └─{gnome-session-b},1672
  │   │   ├─{gdm-session-wor},1635
  │   │   └─{gdm-session-wor},1636
  │   ├─{gdm},1200
  │   ├─{gdm},1201
  │   └─{gdm},1617
  ├─gssproxy,772 -D
  │   ├─{gssproxy},778
  │   ├─{gssproxy},779
  │   ├─{gssproxy},780
  │   ├─{gssproxy},781
  │   └─{gssproxy},782
  ├─ibus-x11,1725,gdm --kill-daemon
  │   ├─{ibus-x11},1730
  │   └─{ibus-x11},1731
  ├─irqbalance,753 --foreground
  ├─ksmtuned,826 /usr/sbin/ksmtuned
  │   └─sleep,1943 60
  ├─libvirtd,1156
  │   ├─{libvirtd},1215
  │   ├─{libvirtd},1216
  │   ├─{libvirtd},1217
  │   ├─{libvirtd},1218
  │   ├─{libvirtd},1219
  │   ├─{libvirtd},1220
  │   ├─{libvirtd},1221
  │   ├─{libvirtd},1222
  │   ├─{libvirtd},1223
  │   ├─{libvirtd},1224
  │   ├─{libvirtd},1282
  │   ├─{libvirtd},1283
  │   ├─{libvirtd},1284
  │   ├─{libvirtd},1285
  │   └─{libvirtd},1286
  ├─lsmd,755,libstoragemgmt -d
  ├─lvmetad,526 -f
  ├─master,1431 -w
  │   ├─pickup,1434,postfix -l -t unix -u
  │   └─qmgr,1435,postfix -l -t unix -u
  ├─packagekitd,1738
  │   ├─{packagekitd},1745
  │   └─{packagekitd},1746
  ├─polkitd,738,polkitd --no-debug
  │   ├─{polkitd},786
  │   ├─{polkitd},796
  │   ├─{polkitd},812
  │   ├─{polkitd},814
  │   └─{polkitd},824
  ├─pulseaudio,1701,gdm --start --log-target=syslog
  │   └─{pulseaudio},1704
  ├─rngd,746 -f
  ├─rsyslogd,744 -n
  │   ├─{rsyslogd},774
  │   └─{rsyslogd},783
  ├─rtkit-daemon,804,rtkit
  │   ├─{rtkit-daemon},815
  │   └─{rtkit-daemon},816
  ├─smartd,748 -n -q never
  ├─sshd,1148 -D
  │   ├─sshd,1210    
  │   │   └─bash,1438
  │   │       └─pstree,1945 -aup
  │   └─sshd,1437    
  │       └─sftp-server,1553
  ├─systemd-journal,504
  ├─systemd-logind,742
  ├─systemd-udevd,540
  ├─tuned,1151 -Es /usr/sbin/tuned -l -P
  │   ├─{tuned},1256
  │   ├─{tuned},1260
  │   ├─{tuned},1267
  │   └─{tuned},1276
  ├─upowerd,1682
  │   ├─{upowerd},1683
  │   └─{upowerd},1684
  ├─vmtoolsd,752
  │   └─{vmtoolsd},821
  ├─wpa_supplicant,1743 -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -P/var/
  └─xdg-permission-,1734,gdm
      ├─{xdg-permission-},1736
      └─{xdg-permission-},1739

三: 进程的启动方式

3.1 手工启动

(1) 前台启动: 用户输入命令,直接执行程序

(2)后台启动: 在命令行尾加上“&” 符号

[root@localhost opt]# ls         #前台启动ls 命令
rh 
[root@localhost opt]# sleep 10    #前台启动sleep 命令
 
[root@localhost opt]# sleep 10 &   # 后台启动sleep命令
[1] 5529                           #显示的是后台命令的序号和进程号
[root@localhost opt]# 

3.2 调度启动

(1) 使用at 命令 设置一次性计划任务

at 【HH:MM】 【yyyy-mm-dd】 #设置计划任务

[root@localhost opt]# date
20210624日 星期四 11:42:29 CST
[root@localhost opt]# at 11:45 2021-06-24     #在2021-06-24 11:25 分执行计划任务,当天执行,年月日可以省略
at> pgrep -U root | wc -l > /tmp/ps.root      #执行的计划 (命令)
at> <EOT>                                     #按 ctrl + D 提交任务
job 1 at Thu Jun 24 11:45:00 2021

atq #查看未执行的任务列表

atrm 序号 #删除任务

[root@localhost opt]# atq                 #查看为执行的计划任务
5    Thu Jun 24 12:00:00 2021 a root      #编号
[root@localhost opt]# atrm 5               #删除编号为 5 的计划任务
[root@localhost opt]# atq

(2) 使用crontab 命令设置周期性计划任务
crontab能够周期性的按照预先设置的时间周期(分 ,时 , 日, 月,周) 重复执行用户指定的命令操作
下载cronie 和 crontabs 软件包,
在这里插入图片描述
并启用服务,设置为开机自启
在这里插入图片描述

(3)编辑计划任务

crontab -e [-u 用户名] # -u 缺省,默认是当前用户

[root@localhost ~]# crontab -e
30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)    #每月每天 0130 分 执行 cp -a /var/log/messages /root/log-$(date +%Y-%m-%d) 命令

crontab 主要有三个配置文件,

全局配置文件: 位于文件 /etc/crontab
系统默认的设置: 位于目录/etc/cron.*/
用户定义的设置: 位于文件 /var/spool/cron/用户名

crontab 的命令实际是在编写 /var/spool/cron/用户名 这个文件,所以我们也可以直接编写 该文件,设置计划任务

或者 编写 全局配置文件 /etc/crontab

[root@localhost ~]# echo '30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)' > /var/spool/cron/root
[root@localhost ~]# vim /var/spool/cron/root 
30 1 * * * cp -a /var/log/messages /
root/log-$(date +%Y-%m-%d)

通过编写 /etc/crontab 的方式编写 ,这种方式 只有root 才可以

[root@localhost ~]# vim /etc/crontab                                
30 2 * * *  root cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)   #要在时间后面加上 指定的用户

配置格式:

字段:说明
分钟:取值为0到59 之间的任意整数
小时:取值为0到23 的任意整数
日期:取值为1 到31 的任意整数
月份:取值为 1 到12 的任意整数
星期:取值为 0到 7 之间任意整数。 0 或 7 代表周日
命令:要执行的命令或者程序脚本

时间数值的特殊表示方法
“ * ” 表示该范围内任意的时间
例:0 1 * * * 每天的凌晨1点
“,” 表示 间隔的多个不连续时间点
例:30 8,10 * * * 每天的8点30 和10 点30
“-” 表示 一个连续的时间范围
例:30 8-10 * * * 每天的 8点30 分 到 10 点 30 分
“/” 表示间隔的时间频率
例30 */2 * * * 每天都每隔两小时,在30分钟时候

(4)查看计划任务
crontab -l [-u 用户名]

[root@localhost ~]# crontab -l                                     #查看当前用户(root) 的计划任务
30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)

(5)删除
crontab -r [-u 用户名] #清空用户所有计划任务

crontab -e #进入编辑界面后,手动一条一条的精确删除

[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l 
no crontab for root

四:调度进程与结束进程

4.1 进程的前后台调度

(1)Ctrl + Z键组合
将当前进程挂起。即调入后台,并停止执行

root@localhost opt]# vim a.txt   #再按下  ctrl +z 键 

[1]+  已停止               vim a.txt

(2)jobs [ -l ] 命令
查看处于后台的任务列表

[root@localhost opt]# jobs 
[1]+  已停止               vim a.txt
[root@localhost opt]# jobs  -l           # jobs -l  可以显示进程的pid 号
[1]+  4666 停止                  vim a.txt

(3) fg 命令
将后台进程恢复到前台运行,可以指定任务序号

root@localhost opt]# jobs -l                     #查看后台进程
[1]   4666 停止                  vim a.txt 
[2]-  4714 停止                  sleep 1000
[3]+  4715 停止 (信号)         top
[root@localhost opt]# fg 3               #将编号为3的进程恢复到前台执行

[root@localhost opt]# fg                   #不加编号默认恢复最后一个  
sleep 1000
[root@localhost opt]# jobs -l
[1]+  4666 停止                  vim a.txt

4.2 结束进程

(1) Ctrl +c键 组合

中断正在执行的命令

[root@localhost opt]# sleep 100   #按下ctrl +c  键可以结束 此次 睡眠
^C

(2) kill 和 killall 命令

kill 用于终止 指定PID 号的进程

killall 用于 终止指定名称相关的所有进程

-9 选项 用于强制终止

[root@localhost opt]# sleep 100 &
[2] 4766
[root@localhost opt]# kill 4766     #终止 pid 号为 4766 的进程     
[root@localhost opt]# jobs -l
[1]+  4666 停止                  vim a.txt
[2]-  4766 已终止               sleep 100

[root@localhost opt]# killall vim     #终止所有的vim 进程  
[root@localhost opt]# jobs -l
[1]+  4666 停止                  vim a.txt   #没有成功终止,依旧是后台停止状态 
[root@localhost opt]# killall -9  vim    #强制 终止 所有的 vim 进程
 
[1]+  已杀死               vim a.txt

oot@localhost opt]# top &
[1] 4785
[root@localhost opt]# killall top      #终止 所有的 top 进程

[1]+  已停止               top

#注,killall 是终止所有的 同名进程 ,包括其他用户 执行的 。会造成 误终止进程

(3) pkill 命令

pkill 命令可以根据特定的条件终止相应的进程

常用命令选项

-U :根据进程所属的用户名终止相应的进程

-G : 根据进程所属组 终止相应进程

-t : 根据进程所在的终端终止相应的进程

[root@localhost opt]# pgrep -l -U test     #查看test 用户的进程
4859 bash
4898 top

[root@localhost opt]# pkill -U test          #终止用户 test 的进程
[root@localhost opt]# pgrep -l -U test
4859 bash

[root@localhost opt]# pgrep -l -G test     #查看test 组 的进程
4859 bash
4938 sleep
[root@localhost opt]# pkill -G test          #终止 test 组的进程
[root@localhost opt]# pgrep -l -G test
4859 bash
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值