目录
一、程序、进程、线程
1.1程序(Program)
1.2进程(Process)
1.3线程(Thread)
1.4区别总结
1.5关系
1.6例子
二、查看进程
2.1查看进程中的线程
2.2ps命令
2.3 top命令
2.4pgrep命令
2.5pstree
2.6jobs、bg、fg命令
三、杀死进程 (kill、pkill、killall)
3.1kill 命令
3.2pkill 命令
3.3killall 命令
3.4区别总结
3.5选择依据
四、计划任务
4.1at 命令
4.2crontab 命令
4.3总结
一、程序、进程、线程
程序、进程和线程是计算机科学中的三个基本概念,理解它们的含义以及它们之间的区别对于理解操作系统和应用程序的运行非常重要。
1.1程序(Program)
-
定义:程序是一个存储在磁盘上的静态代码文件,包含一组指令,用于执行特定任务。它是一个被存储在磁盘上的可执行文件。
-
特点:程序本身不具有任何动态行为,只是一个静态的实体,例如
.exe
文件、脚本文件等。
1.2进程(Process)
-
定义:进程是程序的一次执行实例,它是操作系统分配资源和调度的基本单位。一个程序可以对应多个进程,例如同一个程序可以被多次启动,产生多个进程。
-
特点:
-
动态:进程是程序的动态执行状态,包含了程序代码、数据、堆栈、寄存器、程序计数器等。
-
资源:进程拥有自己的地址空间和系统资源,如内存、文件描述符、网络连接等。
-
隔离:进程之间是隔离的,一个进程无法直接访问另一个进程的地址空间。
-
1.3线程(Thread)
-
定义:线程是进程中的一个执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源。
-
特点:
-
轻量:线程比进程更轻量级,创建和销毁的开销较小。
-
共享资源:同一进程内的线程共享进程的地址空间和资源,如全局变量、打开的文件等。
-
独立执行:每个线程有自己的栈、寄存器和程序计数器,但与其他线程共享进程的其他资源。
-
1.4区别总结
-
创建与销毁:
-
程序:存储在磁盘上的静态文件,不涉及创建与销毁。
-
进程:操作系统分配资源、创建、销毁的单位,开销较大。
-
线程:进程内的执行单元,创建和销毁开销较小。
-
-
资源和隔离:
-
程序:无动态资源分配。
-
进程:独立的资源和地址空间,相互隔离。
-
线程:共享进程的资源和地址空间,互相协作。
-
-
执行与调度:
-
程序:不涉及执行,仅作为静态实体存在。
-
进程:操作系统调度的基本单位,具有独立的执行上下文。
-
线程:CPU调度的基本单位,独立执行但共享资源。
-
1.5关系
-
程序是静态的代码文件,进程是程序的动态运行实例,线程是进程中的执行单元。一个程序可以启动多个进程,一个进程可以包含多个线程。
1.6例子
假设一个文字处理程序(如Microsoft Word):
-
程序:磁盘上的Word可执行文件。
-
进程:当你打开多个Word文档时,每个文档对应一个进程,每个进程有独立的内存空间。
-
线程:在一个Word进程中,同时进行的拼写检查、自动保存、用户输入处理等,每个任务可以由不同的线程执行,这些线程共享进程的内存和资源。
二、查看进程
2.1查看进程中的线程
[root@localhost ~]# grep -i threads /proc/39217/status
Threads: 1
[root@localhost ~]# prtstat 39217
Process: httpd State: S (sleeping)
CPU#: 1 TTY: 0:0 Threads: 1
Process, Group and Session IDs
Process ID: 39217 Parent ID: 1
Group ID: 39217 Session ID: 39217
T Group ID: -1
Page Faults
This Process (minor major): 2347 3
Child Processes (minor major): 0 0
CPU Times
This Process (user system guest blkio): 0.14 2.40 0.00 0.00
Child processes (user system guest): 0.00 0.00 0.00
Memory
Vsize: 229 MB
RSS: 5136 kB RSS Limit: 18446744073709 MB
Code Start: 0x555c8f242000 Code Stop: 0x555c8f2bb414
Stack Start: 0x7ffd3ea1e2a0
Stack Pointer (ESP): 0x7ffd3ea1def8 Inst Pointer (EIP): 0x7fa0ea9bab23
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
2.2ps命令
ps 命令查看静态的进程统计信息
ps
命令用于显示系统中进程的静态快照。以下是常用参数和选项的详细介绍:
2.2.1常用的参数
-
-a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息。
-
-u:使用以用户为主的格式输出进程信息。
-
-x:显示当前用户在所有终端下的进程信息。
-
-e:显示系统内的所有进程信息。
-
-1:使用长格式显示进程信息。
-
-f:使用完整的格式显示进程信息。
2.2.2常用的选项组合
ps -aux
此命令将以简单列表的形式显示出进程信息。第一行为列表标题,其中各字段的含义描述如下。
2.2.3输出信息字段含义
-
USER:启动该进程的用户账号的名称。
-
PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的。
-
%CPU:CPU 占用的百分比。
-
%MEM:内存占用的百分比。
-
VSZ:该进程使用的虚拟内存量(KB)。
-
RSS:该进程占用的物理内存量(KB)。
-
TTY:表明该进程在哪个终端上运行。不是从终端启动的进程则显示为
?
。-
pts:远程登录终端。
-
tty1-tty6:字符界面终端。
-
?:系统本身执行的进程。
-
-
STAT:该进程的状态:
-
D:不可中断的休眠状态。
-
R:正在运行状态。
-
S:处于休眠状态,可被唤醒。
-
T:停止状态,可能是在后台暂停或进程处于跟踪调试状态。
-
Z:僵尸进程,进程已经中止,但是部分程序还在内存中。
-
其他状态标识
-
<:表示进程运行在高优先级上。
-
N:表示进程运行在低优先级上。
-
L:表示进程有页面锁定在内存中。
-
s:表示进程是控制进程。
-
l:表示进程是多线程的。
-
+:表示当前进程运行在前台。
2.2.4其他字段
-
START:启动该进程的时间。
-
TIME:该进程占用的 CPU 时间。
-
COMMAND:启动该进程的命令的名称。
2.2.5例子1
ps -aux
输出示例及解释
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 17000 1288 ? Ss 09:01 0:01 /sbin/init
user 1234 0.5 1.2 123456 98765 pts/0 R+ 09:10 0:10 /usr/bin/python3 script.py
-
USER
:root
启动了 PID 为1
的进程。 -
PID
:进程 ID。 -
%CPU
:CPU 使用率。 -
%MEM
:内存使用率。 -
VSZ
:虚拟内存量。 -
RSS
:物理内存量。 -
TTY
:进程运行的终端。 -
STAT
:进程状态(Ss
和R+
)。 -
START
:进程启动时间。 -
TIME
:进程占用的 CPU 时间。 -
COMMAND
:启动该进程的命令。
通过理解这些字段和选项,可以更有效地监控和管理系统中的进程。
2.2.6例子2
[root@benet ~]# vim a.txt #tty1(第一个终端)
[root@localhost ~]# ps -aux |grep vim #(tty2)
root 14549 0.0 0.1 151228 5072 pts/0 S+ 13:51 0:00 vim a.txt
root 14564 0.0 0.0 112660 964 pts/1 R+ 13:52 0:00 grep --color=auto vim
ctrl+z #tty1(第一个终端)
[1]+ Stopped vim a.txt
[root@localhost ~]# ps -aux |grep vim #(tty2)
root 14549 0.0 0.1 151228 5072 pts/0 T 13:51 0:00 vim a.txt
root 14579 0.0 0.0 112660 964 pts/1 R+ 13:53 0:00 grep --color=auto vim
注:
ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP 信号,挂起一个进程。将作业放置到后台(暂停)
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销
2.2.7常用的选项组合
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 - 48425 ep_pol Jun26 ? 00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root 2 0 0 80 0 - 0 kthrea Jun26 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo Jun26 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker Jun26 ? 00:00:00 [kworker/0:0H]
1 S root 7 2 0 -40 - - 0 smpboo Jun26 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp Jun26 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp Jun26 ? 00:00:01 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo Jun26 ? 00:00:00 [watchdog/0]
5 S root 11 2 0 -40 - - 0 smpboo Jun26 ? 00:00:00 [watchdog/1]
1 S root 12 2 0 -40 - - 0 smpboo Jun26 ? 00:00:00 [migration/1]
1 S root 13 2 0 80 0 - 0 smpboo Jun26 ? 00:00:00 [ksoftirqd/1]
1 S root 15 2 0 60 -20 - 0 worker Jun26 ? 00:00:00 [kworker/1:0H]
5 S root 17 2 0 80 0 - 0 devtmp Jun26 ? 00:00:00 [kdevtmpfs]
1 S root 18 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [netns]
1 S root 19 2 0 80 0 - 0 watchd Jun26 ? 00:00:00 [khungtaskd]
1 S root 20 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [writeback]
1 S root 21 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [kintegrityd]
1 S root 22 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [bioset]
1 S root 23 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [kblockd]
1 S root 24 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [md]
1 S root 30 2 0 80 0 - 0 kswapd Jun26 ? 00:00:02 [kswapd0]
1 S root 31 2 0 85 5 - 0 ksm_sc Jun26 ? 00:00:00 [ksmd]
1 S root 32 2 0 99 19 - 0 khugep Jun26 ? 00:00:00 [khugepaged]
1 S root 33 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [crypto]
1 S root 41 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [kthrotld]
1 S root 43 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [kmpath_rdacd]
1 S root 44 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00 [kpsmoused]
1 S root 46 2 0 60 -20 - 0 rescue Jun26 ? 00:00:00
各列的解释:
F:内核分配给进程的系统标记。
S:进程的状态。
UID:启动这些进程的用户。
PID: 进程的进程ID.
PPID:父进程的进程号(如果该进程是由另一“个进程启动的)
C:进程生命周期中的CPU利用率。
PRI:进程的优先级(越大的数字代表越低的优先级)。
NI: 谦让度值用来参与决定优先级。
ADDR:进程的内存地址。
SZ:假如进程被换出,所需交换空间的大致大小。
WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名。
STIME:进程启动时的系统时间。
TTY:进程启动时的终端设备。 pts/0255代表虚拟终端,一般是远程连接的终端;tty1tty7 代表本地控制台终端
TIME:运行进程需要的累计CPU时间。
CMD:进程的启动命令。
2.2.8僵尸进程:
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
2.3 top命令
top命令-查看进程动态信息
top
命令是 Linux 系统中用于实时显示系统中各个进程的资源使用情况的命令。以下是对 top
命令的详解,包括其输出字段、常用交互命令和选项。
2.3.1top
命令的基本使用
在终端中输入 top
并回车,即可启动 top
命令.
2.3.2top命令的输出字段
在启动 top
命令后,会显示如下信息:
①第一行:系统时间和运行时间
top - 09:01:12 up 10 days, 2:13, 1 user, load average: 0.25, 0.15, 0.05
-
09:01:12:当前系统时间。
-
up 10 days, 2:13:系统已经运行的时间。
-
1 user:当前登录的用户数量。
-
load average:系统的负载平均值,分别为 1 分钟、5 分钟和 15 分钟的平均负载。
②第二行:进程总览
Tasks: 123 total, 2 running, 121 sleeping, 0 stopped, 0 zombie
-
123 total:总进程数。
-
2 running:正在运行的进程数。
-
121 sleeping:处于睡眠状态的进程数。
-
0 stopped:停止的进程数。
-
0 zombie:僵尸进程数。
③第三行:CPU 使用情况
%Cpu(s): 1.2 us, 0.5 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
-
us:用户空间占用 CPU 的百分比。
-
sy:内核空间占用 CPU 的百分比。
-
ni:改变过优先级的进程占用 CPU 的百分比。
-
id:空闲 CPU 的百分比。
-
wa:等待 I/O 的 CPU 时间百分比。
-
hi:硬件中断占用的 CPU 时间百分比。
-
si:软件中断占用的 CPU 时间百分比。
-
st:虚拟机占用的 CPU 时间百分比。
④第四行:内存使用情况
KiB Mem : 16365284 total, 1234568 free, 5678904 used, 1234568 buff/cache
-
total:总内存。
-
free:空闲内存。
-
used:已使用的内存。
-
buff/cache:用于缓冲和缓存的内存。
⑤第五行:交换内存使用情况
KiB Swap: 2097148 total, 2097148 free, 0 used. 5678904 avail Mem
-
total:总交换空间。
-
free:空闲交换空间。
-
used:已使用的交换空间。
-
avail Mem:可用的物理内存。
⑥进程列表
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
-
PID:进程 ID。
-
USER:进程所有者。
-
PR:进程优先级。
-
NI:进程的 Nice 值。
-
VIRT:进程使用的虚拟内存总量。
-
RES:进程使用的物理内存量。
-
SHR:进程使用的共享内存量。
-
S:进程状态(
R
运行,S
睡眠,D
不可中断睡眠,T
停止,Z
僵尸)。 -
%CPU:进程占用的 CPU 百分比。
-
%MEM:进程占用的内存百分比。
-
TIME+:进程使用的总 CPU 时间。
-
COMMAND:进程启动的命令名称。
2.3.3常用交互命令
在 top
运行过程中,可以使用以下键来与 top
进行交互:
-
h:显示帮助。
-
k:杀死一个进程。输入进程 ID 和信号。
-
q:退出
top
。 -
r:改变一个进程的优先级(renice)。
-
u:按用户筛选进程。
-
P:按 CPU 使用率排序。
-
M:按内存使用率排序。
-
T:按运行时间排序。
-
c:切换显示完整命令行。
-
1:显示每个 CPU 的使用情况。
2.3.4常用选项
可以在启动 top
命令时使用一些选项来定制输出:
-
-d:指定刷新间隔时间,例如
top -d 5
表示每 5 秒刷新一次。 -
-p:指定只监视特定的进程,例如
top -p 1234
。 -
-u:指定只显示特定用户的进程,例如
top -u username
。
2.3.5例子
top -d 5 -u root
此命令每 5 秒刷新一次,只显示 root
用户的进程。
通过掌握 top
命令的输出字段和交互命令,可以更有效地监控和管理系统中的进程和资源使用情况。
2.3.6top
命令显示的 7 行进程信息详解
-
PID(进程 ID)
-
进程的唯一标识符。
-
-
USER(进程所有者的用户名)
-
启动该进程的用户账号的名称。
-
-
PR(优先级)
-
进程的优先级,由内核动态调整,用户不能直接修改。
-
-
NI(Nice 值)
-
进程的优先级值,负值表示高优先级,正值表示低优先级,用户可以自己调整。
-
-
VIRT(virtual memory usage)
-
虚拟内存,是进程正在使用的所有内存(在
ps
命令中标为VSZ
)。-
进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等。
-
假如进程申请 100MB 的内存,但实际只使用了 10MB,那么它会增长 100MB,而不是实际的使用量。
-
-
-
RES(resident memory usage)
-
常驻内存,是进程实际使用的物理内存(在
ps
命令中标为RSS
)。-
进程当前使用的内存大小,但不包括 swap out。
-
包含其他进程的共享内存。
-
如果申请 100MB 的内存,实际使用 10MB,它只增长 10MB,与
VIRT
相反。 -
统计加载的库文件所占内存大小。
-
-
-
SHR(shared memory usage)
-
共享内存大小,单位为 KB。
-
包括自身进程的共享内存,也包括其他进程的共享内存。
-
虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小。
-
计算某个进程所占的物理内存大小公式:
RES - SHR
。 -
swap out
后,共享内存将会降下来。
-
-
2.4pgrep命令
pgrep
是一个用于根据模式匹配查找进程 ID 的命令。它允许你使用进程名或其他属性来查找进程,并返回匹配的进程 ID。以下是 pgrep
的详细参数和使用方法:
2.4.1常用参数
-
-d <string>:指定分隔符,默认是换行符。
-
-l:显示进程 ID 以及对应的进程名。
-
-a:显示进程 ID 以及对应的完整命令行。
-
-u <username>:匹配特定用户的进程。
-
-U <uid>:匹配特定用户 ID 的进程。
-
-g <group>:匹配特定进程组 ID 的进程。
-
-s <sid>:匹配特定会话 ID 的进程。
-
-t <tty>:匹配特定终端的进程。
-
-v:反向匹配。
-
-x:精确匹配进程名。
-
-f:匹配完整的命令行。
-
-c:显示匹配的进程数量。
-
-n:仅显示最近启动的一个进程的 PID。
-
-o:仅显示最早启动的一个进程的 PID。
2.4.2使用方法
查找进程 ID
最基本的用法是查找特定名称的进程 ID。例如,查找 httpd
进程的 PID:
pgrep httpd
2.4.3显示进程 ID 和进程名
使用 -l
参数可以显示进程 ID 以及对应的进程名:
pgrep -l httpd
2.4.4显示进程 ID 和完整命令行
使用 -a
参数可以显示进程 ID 以及对应的完整命令行:
pgrep -a httpd
2.4.5根据用户匹配
使用 -u
参数匹配特定用户的进程:
pgrep -u username httpd
例如,查找 root
用户的 httpd
进程:
pgrep -u root httpd
2.4.6反向匹配
使用 -v
参数进行反向匹配:
pgrep -v httpd
2.4.7精确匹配进程名
使用 -x
参数进行精确匹配进程名:
pgrep -x httpd
2.4.8匹配完整命令行
使用 -f
参数匹配完整的命令行:
pgrep -f '/usr/sbin/httpd -k start'
2.4.9显示匹配的进程数量
使用 -c
参数显示匹配的进程数量:
pgrep -c httpd
2.4.10显示最近启动的一个进程的 PID
使用 -n
参数仅显示最近启动的一个进程的 PID:
pgrep -n httpd
2.4.11显示最早启动的一个进程的 PID
使用 -o
参数仅显示最早启动的一个进程的 PID:
pgrep -o httpd
2.4.13查找并显示 nginx
进程的 PID 和命令行
pgrep -a nginx
2.4.14查找 root
用户启动的 sshd
进程
pgrep -u root sshd
2.4.15查找所有非 httpd
进程的 PID
pgrep -v httpd
2.5pstree
pstree
命令用于以树状结构显示系统中的进程及其父子关系。它是一个非常有用的工具,可以帮助用户直观地了解进程的层次结构以及进程之间的关系。
2.5.1使用方法
基本用法
pstree
运行此命令将显示系统中所有进程的树状结构。
2.5.2常用参数
-
-p:显示进程 ID。
-
-u:显示进程所属的用户。
-
-a:显示进程的完整命令行。
-
-c:对同名进程不进行合并。
-
-n:按进程 ID 排序显示(默认按进程名排序)。
-
-h:高亮当前终端用户的进程。
-
-H <pid>:高亮指定进程 ID 的进程。
-
-s:显示进程的父进程树。
-
-l:显示长格式的进程树(不折行)。
-
-V:显示版本信息。
2.5.3示例及解释
显示进程树
pstree
这将显示系统中所有进程的树状结构。例如:
init─┬─cron
├─sshd───sshd───bash───pstree
└─nginx───nginx
显示进程 ID
pstree -p
显示每个进程的 PID。例如:
init(1)─┬─cron(2534)
├─sshd(2546)─┬─sshd(2578)─┬─bash(2580)───pstree(2601)
│ └─nginx(2590)
显示进程所属用户
pstree -u
显示每个进程所属的用户。例如:
init─┬─cron(root)
├─sshd(root)───sshd(user)───bash(user)───pstree(user)
└─nginx(www-data)───nginx(www-data)
显示进程的完整命令行
pstree -a
显示每个进程的完整命令行。例如:
init
├─cron
├─sshd
│ ├─sshd
│ │ └─bash
│ │ └─pstree -a
└─nginx
└─nginx
高亮当前终端用户的进程
pstree -h
高亮当前终端用户的进程,便于区分。例如:
init
├─cron
├─sshd
│ ├─sshd
│ │ └─bash
│ │ └─pstree -h
└─nginx
└─nginx
高亮指定进程
pstree -H <pid>
高亮指定 PID 的进程。例如,高亮 PID 为 1234 的进程:
pstree -H 1234
显示长格式的进程树
pstree -l
显示长格式的进程树,不进行折行。例如:
init───sshd───bash───pstree -l
显示当前系统中的进程树及其 PID
pstree -p
显示当前系统中的进程树及其完整命令行
pstree -a
显示当前系统中的进程树,按 PID 排序
pstree -n
显示当前系统中的进程树,显示进程所属的用户
pstree -u
高亮当前终端用户的进程
pstree -h
2.5.4常用组合
[root@localhost ~]# pstree -pua xiewei
bash,15500
└─vim,15547 1.txt
2.6jobs、bg、fg命令
2.6.1jobs
命令
jobs
命令用于显示当前终端会话中的作业列表及其状态。
2.6.2使用方法
jobs [options] [job_spec]
2.6.3常用选项
-
-l:显示作业的 PID。
-
-n:只列出自上次通知后状态发生变化的作业。
-
-p:只显示每个作业的进程 ID。
-
-r:只显示正在运行的作业。
-
-s:只显示停止的作业。
2.6.4示例
显示当前终端中的所有作业及其状态:
jobs
显示作业的 PID:
jobs -l
显示当前终端中正在运行的作业:
jobs -r
2.6.5fg
命令
fg
命令用于将后台中的作业移到前台运行。
2.6.6使用方法
fg [job_spec]
-
job_spec:指定要移到前台的作业。可以是
%n
(作业编号)、%string
(作业名称)等。
2.6.7示例
将最近的一个后台作业移到前台运行:
fg
将特定作业编号的作业移到前台运行,例如作业编号为 1:
fg %1
2.6.8bg
命令
bg
命令用于将暂停(停止)状态的作业恢复到后台运行。
2.6.9使用方法
bg [job_spec]
-
job_spec:指定要恢复到后台运行的作业。可以是
%n
(作业编号)、%string
(作业名称)等。
2.6.10示例
将最近的一个暂停的作业恢复到后台运行:
bg
将特定作业编号的作业恢复到后台运行,例如作业编号为 1:
bg %1
2.6.11综合示例
示例:管理作业
-
启动一个长时间运行的命令,例如:
sleep 1000
-
在命令运行期间,按
Ctrl+Z
暂停作业。这时终端会显示类似以下信息:[1]+ Stopped sleep 1000
-
使用
jobs
命令查看当前暂停的作业:jobs
输出:
[1]+ Stopped sleep 1000
-
使用
bg
命令将暂停的作业恢复到后台继续运行:bg %1
输出:
[1]+ sleep 1000 &
-
使用
fg
命令将后台中的作业移到前台运行:fg %1
-
使用
jobs -l
命令查看作业的详细信息,包括 PID:jobs -l
输出:
[1]+ 12345 Stopped (signal) sleep 1000
2.6.12总结
-
jobs
命令:用于显示当前终端会话中的作业列表及其状态。 -
fg
命令:用于将后台中的作业移到前台运行。 -
bg
命令:用于将暂停(停止)状态的作业恢复到后台运行。
三、杀死进程 (kill、pkill、killall)
3.1kill
命令
kill
命令用于向一个或多个进程发送信号,通常用于终止进程。默认发送 SIGTERM
信号,请求进程优雅地终止。
3.1.1使用方法
kill [signal] <pid>
-
signal:要发送的信号,可以是信号的名称(如
SIGTERM
、SIGKILL
)或信号的编号。 -
pid:进程 ID,可以是一个或多个进程 ID。
3.1.2示例
终止 PID 为 1234 的进程:
kill 1234
发送 SIGKILL
信号强制终止 PID 为 1234 的进程:
kill -9 1234
3.2pkill
命令
pkill
命令用于通过进程名来发送信号给进程。默认发送 SIGTERM
信号。
3.2.1使用方法
pkill [options] <pattern>
-
options:各种选项来细化进程匹配的条件。
-
pattern:进程名称的模式。
3.2.2常用选项
-
-u <username>:匹配特定用户的进程。
-
-f:匹配完整的命令行。
-
-9:发送
SIGKILL
信号。 -
-x:精确匹配进程名。
-
-l:显示被杀死的进程名。
-
-a:显示被杀死的进程的完整命令行。
3.3.3示例
终止所有名为 httpd
的进程:
pkill httpd
终止由 root
用户启动的 httpd
进程:
pkill -u root httpd
强制终止所有名为 httpd
的进程:
pkill -9 httpd
3.3killall
命令
killall
命令用于通过进程名发送信号给所有匹配的进程,默认发送 SIGTERM
信号。
3.3.1使用方法
killall [options] <name>
-
options:各种选项来细化进程匹配的条件。
-
name:进程名称。
3.3.2常用选项
-
-u <username>:匹配特定用户的进程。
-
-e:精确匹配进程名。
-
-I:忽略进程名的大小写。
-
-i:交互式,逐个询问是否终止进程。
-
-v:显示被杀死的进程。
-
-r <regex>:使用正则表达式匹配进程名。
-
-9:发送
SIGKILL
信号。
3.3.3示例
终止所有名为 httpd
的进程:
killall httpd
强制终止所有名为 httpd
的进程:
killall -9 httpd
终止由 root
用户启动的 httpd
进程:
killall -u root httpd
3.4区别总结
-
kill
:通过进程 ID 发送信号,需要知道具体的进程 ID。 -
pkill
:通过进程名发送信号,支持多种选项进行精确匹配,可匹配部分名称或命令行。 -
killall
:通过进程名发送信号,默认会终止所有匹配的进程,支持精确匹配和正则表达式。
3.5选择依据
-
使用
kill
当你知道确切的进程 ID 时。 -
使用
pkill
当你要通过进程名或部分命令行匹配多个进程时。 -
使用
killall
当你要通过进程名匹配所有同名进程时。
四、计划任务
4.1at
命令
at
命令用于在将来的特定时间安排一次性任务。使用 at
可以在指定的时间点执行某个命令或脚本。
4.1.1使用方法
-
启动
at
命令:
time:指定任务执行的时间。例如,可以使用at [time]
now + 1 minute
、3pm
、2:30am
等。 -
输入命令: 在
at
提示符下,输入要执行的命令,输入完成后按Ctrl + D
结束输入。例如:at 3pm at> echo "Hello World" > /tmp/hello.txt at> <Ctrl + D>
-
查看已安排的任务:
atq
-
删除已安排的任务:
atrm [job_number]
-
job_number:使用
atq
命令列出的任务编号。
-
4.1.2示例
安排任务在下午 3 点执行:
at 3pm
at> echo "Task executed at 3pm" > /tmp/task.log
at> <Ctrl + D>
查看已安排的任务:
atq
删除任务编号为 2 的任务:
crontab -e
4.2crontab
命令
crontab
命令用于管理定时任务表。它允许用户安排周期性执行的任务,例如每天、每周或每月。crontab
是 "cron table" 的缩写,其中 "cron" 来源于希腊语中的 "χρόνος" (chronos),意思是时间。
4.2.1使用方法
-
编辑用户的 crontab 文件:
crontab -e
-
查看用户的 crontab 文件:
crontab -l
-
删除用户的 crontab 文件:
crontab -r
-
为特定用户管理 crontab 文件(需要管理员权限):
crontab -u [username] -e
4.2.2crontab 文件格式
每一行定义一个任务,由 5 个时间字段和一个命令字段组成:
* * * * * command_to_be_executed
- - - - -
| | | | |
| | | | +---- Day of the week (0 - 7) (Sunday is 0 and 7)
| | | +------ Month (1 - 12)
| | +-------- Day of the month (1 - 31)
| +---------- Hour (0 - 23)
+------------ Minute (0 - 59)
4.2.3时间字段示例
-
* * * * *
:每分钟执行 -
0 0 * * *
:每天午夜执行 -
0 6 * * 1
:每周一早上 6 点执行 -
0 0 1 * *
:每月 1 号午夜执行 -
0 0 1 1 *
:每年 1 月 1 号午夜执行
4.2.4示例
编辑当前用户的 crontab 文件,添加以下行以每天早上 7 点执行备份脚本:
crontab -e
在编辑器中添加:
0 7 * * * /home/user/backup.sh
查看当前用户的 crontab 文件:
crontab -l
删除当前用户的 crontab 文件:
crontab -r
为用户 john
管理 crontab 文件(需要管理员权限):
sudo crontab -u john -e
4.3总结
-
at
命令:用于安排一次性任务在将来的特定时间执行。 -
crontab
命令:用于管理定时任务表,安排周期性任务。通过编辑 crontab 文件,可以在特定的时间和日期周期性地执行任务。