Linux-进程管理
- Linux 进程管理
- 1. 进程的含义
- 2. 进程状态
- 3. 进程工作模式
- 4. 守护进程
- 5. 进程查看命令
- 5.1 `ps` 命令
- 5.2 `top` 命令
- 5.3 `pstree` 命令
- 6. 终止进程的 `kill` 命令
- 7. 前后台运行
- 8. 暂停进程
- 9. 进程文件系统 `/proc`
- 10. 定时任务管理
- 10.1 `at` 命令
- 10.2 `batch` 命令
- 10.3 `cron` 与 `crontab` 命令
- 11. 综合案例:设置用户限制并创建 `crontab` 文件
- 步骤 1:设置用户限制
- 步骤 2:创建 `crontab` 文件
- 步骤 3:验证限制设置
Linux 进程管理
1. 进程的含义
在 Linux 系统中,进程是程序的运行实例,是系统资源分配和调度的基本单位。每个进程都有自己的独立地址空间、程序计数器、寄存器集合和堆栈。进程的状态和行为由操作系统进行管理和调度。
2. 进程状态
进程在其生命周期中会处于不同的状态,这些状态反映了进程当前的活动情况:
- 运行态(Running):进程正在 CPU 上运行,或者已经准备好运行,等待 CPU 时间片。
- 就绪态(Ready):进程已经准备好运行,但当前没有分配到 CPU 时间片,处于等待状态。
- 等待态(Waiting):进程正在等待某些事件的发生,例如 I/O 操作完成。只有当等待的事件发生后,进程才会继续运行。
- 僵尸态(Zombie):进程已经完成,但其父进程尚未读取其状态信息。僵尸进程不能被终止,只能等待父进程读取状态信息后自动消失。
- 挂起态(Stopped):进程被挂起,通常是因为接收到信号(如
SIGSTOP
)或资源不足。挂起的进程可以被恢复运行。
3. 进程工作模式
进程可以以两种模式运行:
- 前台模式:进程在终端中运行,用户可以直接与之交互。如果前台进程终止,终端会发送
SIGHUP
信号给该进程。 - 后台模式:进程在后台运行,用户无法直接与之交互。可以通过在命令后面加上
&
符号将进程放到后台运行。
4. 守护进程
守护进程(Daemon)是一种在后台运行的特殊进程,通常用于提供某种服务。守护进程通常在系统启动时启动,并在系统关闭时停止。常见的守护进程包括 sshd
(SSH 服务)、httpd
(Apache 服务)等。守护进程的特点是:
- 在后台运行,不与终端交互。
- 通常由
init
进程(PID 为 1)管理。 - 可以通过
systemctl
或service
命令管理守护进程。
5. 进程查看命令
5.1 ps
命令
ps
命令用于显示当前系统中运行的进程信息。它可以帮助用户了解系统中各个进程的状态、资源占用情况等。
-
语法:
ps [选项]
-
常用参数:
-a
:显示所有终端上的进程。-u
:显示指定用户的进程。-x
:显示没有控制终端的进程。-e
:显示所有进程。-f
:显示完整格式的进程信息。-l
:显示长格式的进程信息。-o
:自定义输出格式。-p
:指定进程 ID。-t
:指定终端。
-
使用案例:
-
显示当前终端的所有进程:
ps -a
这将列出当前终端中所有活跃的进程,包括它们的进程 ID(PID)、终端(TTY)、累计 CPU 时间等信息。
-
显示所有用户的进程:
ps -aux
-
-
USER
- 含义:运行该进程的用户名称。
- 示例:
hadoop17
表示该进程是由用户hadoop17
启动的。
-
PID
- 含义:进程ID(Process ID),是系统为每个进程分配的唯一标识符。
- 示例:
1234
表示该进程的ID为1234。
-
%CPU
- 含义:该进程占用的CPU使用率(百分比)。
- 示例:
1.2
表示该进程占用了1.2%的CPU资源。
- %MEM
- 含义:该进程占用的物理内存使用率(百分比)。
- 示例:
0.5
表示该进程占用了0.5%的系统物理内存。
- VSZ
- 含义:虚拟内存大小(Virtual Memory Size,单位为KB)。
- 虚拟内存包括进程实际使用的物理内存、已分配但尚未使用的内存,以及进程映射的文件和共享库所占用的内存。
- 示例:
102400
表示该进程的虚拟内存大小为102400 KB。
-
RSS
- 含义:常驻内存大小(Resident Set Size,单位为KB)。
- 常驻内存是指进程实际占用的物理内存大小,不包括已交换出去的内存、映射但未使用的内存等。
- 示例:
51200
表示该进程实际占用的物理内存为51200 KB。
- 含义:常驻内存大小(Resident Set Size,单位为KB)。
-
TTY
- 含义:终端设备(TTY)的名称,表示该进程是从哪个终端启动的。
- 如果进程不是从终端启动的(例如后台服务),通常会显示
?
。
- 如果进程不是从终端启动的(例如后台服务),通常会显示
- 示例:
pts/0
表示该进程是从伪终端pts/0
启动的;?
表示该进程没有关联的终端。
- STAT
- 含义:进程的状态。
- 常见的状态代码包括:
- R:运行状态(Running)。
- S:睡眠状态(Sleeping),进程正在等待某些事件(如磁盘I/O)。
- D:不可中断的睡眠状态(Uninterruptible Sleep),通常是因为进程正在等待硬件设备。
- Z:僵尸状态(Zombie),进程已经结束,但其父进程尚未读取其状态信息。
- T:暂停状态(Stopped),进程被用户或系统暂停。
- W:无驻留页(Paging),进程正在等待页面交换。
- <:高优先级进程。
- N:低优先级进程。
- L:进程正在等待磁盘I/O。
- 常见的状态代码包括:
- 示例:
S
表示该进程处于睡眠状态。
- START
- 含义:进程启动的时间。
- 示例:
Jul01
表示该进程是在7月1日启动的。
- TIME
- 含义:进程实际占用CPU的累计时间(单位为小时:分钟:秒)。
- 示例:
00:01:30
表示该进程累计占用了1分30秒的CPU时间。
- COMMAND
- 含义:启动该进程的命令行。
- 示例:
java -jar myapp.jar
表示该进程是通过java -jar myapp.jar
命令启动的。
示例解释
假设你看到以下输出:
hadoop17 1234 1.2 0.5 102400 51200 pts/0 S Jul01 00:01:30 java -jar myapp.jar
-
用户:
hadoop17
启动了该进程。 -
进程ID:
1234
。 -
CPU占用率:
1.2%
。 -
内存占用率:
0.5%
。 -
虚拟内存大小:
102400 KB
。 -
常驻内存大小:
51200 KB
。 -
终端:从
pts/0
终端启动。 -
状态:处于睡眠状态(
S
)。 -
启动时间:7月1日。
-
累计CPU时间:1分30秒。
-
启动命令:
java -jar myapp.jar
。-
显示指定用户的进程:
ps -u username
这将列出指定用户的所有进程,方便用户查看自己的进程状态。
-
显示没有控制终端的进程:
ps -x
这将列出所有没有控制终端的进程,通常用于查看后台运行的进程。
-
显示完整格式的进程信息:
ps -ef
这将列出所有进程的详细信息,包括进程的启动时间、父进程 ID 等。
-
自定义输出格式:
ps -eo pid,comm,%cpu,%mem
这将自定义输出格式,仅显示进程 ID、命令名称、CPU 使用率和内存占用率。
-
显示特定进程 ID 的进程:
ps -p 1234
这将显示指定进程 ID 的详细信息。
-
5.2 top
命令
top
命令用于实时显示系统中占用资源最多的进程信息。它是一个动态的、交互式的工具,可以帮助用户实时监控系统的性能和资源使用情况。
-
语法:
top [选项]
-
常用参数:
-d <秒数>
:指定刷新间隔时间。-p <PID>
:仅显示指定进程 ID 的进程。-u <用户名>
:仅显示指定用户的进程。-n <次数>
:指定刷新次数。
-
使用案例:
-
实时显示系统中占用资源最多的进程:
top
这将实时显示系统中占用 CPU 和内存最多的进程,包括进程 ID、用户、CPU 使用率、内存占用等信息。
-
指定刷新间隔时间:
top -d 2
这将设置
top
的刷新间隔为 2 秒。 -
仅显示指定用户的进程:
top -u username
这将仅显示指定用户的进程,方便用户查看自己的进程占用情况。
-
仅显示指定进程 ID 的进程:
top -p 1234
这将仅显示指定进程 ID 的进程信息。
-
系统整体状态
top - 10:15:27 up 7:27, 1 user, load average: 0.46, 0.18, 0.12
:10:15:27
:当前系统时间。up 7:27
:系统已经运行了7小时27分钟。1 user
:当前有1个用户登录。load average: 0.46, 0.18, 0.12
:系统的负载平均值,分别为1分钟、5分钟和15分钟的平均值。负载平均值表示在特定时间内,系统中“活跃”(即正在使用CPU或等待I/O操作完成)的进程的平均数量。
任务和CPU状态
-
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
:1 total
:系统中总共有1个任务。0 running
:当前没有正在运行的任务。1 sleeping
:有1个任务处于睡眠状态。0 stopped
:没有停止的任务。0 zombie
:没有僵尸进程。
-
%Cpu(s): 0.0 us, 1.0 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
:0.0 us
:用户空间占用的CPU百分比。1.0 sy
:内核空间占用的CPU百分比。0.0 ni
:用户进程空间内改变过优先级的进程占用的CPU百分比。99.0 id
:CPU空闲时间百分比。0.0 wa
:等待I/O操作完成的时间百分比。0.0 hi
:硬件中断占用的CPU时间百分比。0.0 si
:软件中断占用的CPU时间百分比。0.0 st
:虚拟机偷取的CPU时间百分比。
内存和交换空间状态
-
KiB Mem: 20148448 total, 414552 free, 7178552 used, 8824444 buff/cache
:20148448 total
:总内存大小。414552 free
:空闲内存大小。7178552 used
:已使用的内存大小。8824444 buff/cache
:用作缓冲和缓存的内存大小。
-
KiB Swap: 20971148 total, 20971148 free, 0 used. 1108588 avail Mem
:20971148 total
:总交换空间大小。20971148 free
:空闲交换空间大小。0 used
:已使用的交换空间大小。1108588 avail Mem
:可用内存大小,包括空闲内存和可以被回收的缓存。
进程信息
-
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
:PID
:进程ID。USER
:进程所有者。PR
:优先级。NI
:nice值,影响优先级。VIRT
:进程使用的虚拟内存总量。RES
:进程使用的常驻内存大小。SHR
:进程使用的共享内存大小。S
:进程状态(S表示睡眠,R表示运行等)。%CPU
:进程占用的CPU百分比。%MEM
:进程占用的物理内存百分比。TIME+
:进程启动后占用的总CPU时间。COMMAND
:启动进程的命令名称。
-
92240 hadoop17 20 0 13068 2208 2052 S 0.0 0.1 0:00.00 sftp-server
:92240
:进程ID。hadoop17
:进程所有者。20
:优先级。0
:nice值。13068
:虚拟内存总量。2208
:常驻内存大小。2052
:共享内存大小。S
:进程状态为睡眠。0.0
:进程占用的CPU百分比。0.1
:进程占用的物理内存百分比。0:00.00
:进程启动后占用的总CPU时间。sftp-server
:启动进程的命令名称。
5.3 pstree
命令
pstree
命令以树状图的形式显示当前系统中的进程及其父子关系。它可以帮助用户直观地了解进程的层次结构,非常适合查看复杂的进程关系。
-
语法:
pstree [选项]
-
常用参数:
-p
:显示进程 ID。-u
:显示进程的所有者。-a
:显示每个进程的命令行参数。-h
:高亮显示当前进程及其父进程。-s
:显示指定进程的父进程。-c
:不合并相同的进程。
-
使用案例:
-
显示所有进程的树状图:
pstree
这将以树状图的形式显示系统中所有进程的层次结构。
-
显示所有进程的树状图并显示进程 ID:
pstree -p
这将显示每个进程的 PID,方便用户识别具体的进程。
-
显示所有进程的树状图并显示进程的所有者:
pstree -u
这将显示每个进程的所有者,帮助用户了解进程的归属。
-
显示所有进程的树状图并显示命令行参数:
pstree -a
这将显示每个进程的完整命令行参数,方便用户了解进程的启动方式。
-
高亮显示当前进程及其父进程:
pstree -h
这将高亮显示当前进程及其父进程,帮助用户快速定位当前进程的位置。
-
显示指定进程的父进程:
pstree -s 1234
这将显示指定进程的父进程,帮助用户了解进程的继承关系。
-
6. 终止进程的 kill
命令
kill
命令用于向进程发送信号,通常用于终止进程。它可以帮助用户在需要时停止或暂停进程。
-
语法:
kill [选项] <PID>
-
常用参数:
-9
:强制终止进程(SIGKILL),进程无法捕获此信号,将立即终止。-15
:默认信号,请求进程自行终止(SIGTERM),进程可以捕获此信号并进行清理操作。-1
:挂起进程(SIGINT),类似于用户按下Ctrl+C
。-18
:继续运行被挂起的进程(SIGCONT)。
-
使用案例:
-
终止指定进程:
kill 1234
这将向进程 ID 为 1234 的进程发送默认的
SIGTERM
信号,请求进程自行终止。 -
强制终止指定进程:
kill -9 1234
这将向进程 ID 为 1234 的进程发送
SIGKILL
信号,强制终止进程。 -
挂起指定进程:
kill -1 1234
这将向进程 ID 为 1234 的进程发送
SIGINT
信号,挂起进程。 -
继续运行被挂起的进程:
kill -18 1234
这将向进程 ID 为 1234 的进程发送
SIGCONT
信号,继续运行被挂起的进程。
-
7. 前后台运行
在 Linux 中,用户可以通过以下方式将进程放到前台或后台运行,或者暂停正在运行的进程。
-
后台运行:
command &
这将把命令放到后台运行,用户可以继续在终端中执行其他命令。
-
将后台进程放到前台运行:
fg %1
这将把后台运行的进程(例如进程号为 1 的进程)放到前台运行,用户可以与之交互。
8. 暂停进程
用户可以通过 Ctrl+Z
组合键暂停当前前台进程,然后使用 bg
命令将其放到后台运行。
-
暂停前台进程:
Ctrl+Z
这将暂停当前前台运行的进程。
-
将暂停的进程放到后台运行:
bg %1
这将把暂停的进程放到后台继续运行。
9. 进程文件系统 /proc
/proc
是一个虚拟文件系统,包含系统中所有进程的信息。每个进程都有一个以进程 ID 命名的目录,例如 /proc/1234
,其中包含该进程的详细信息。
-
常用文件:
/proc/<PID>/status
:显示进程的状态信息。/proc/<PID>/cmdline
:显示进程的启动命令。/proc/<PID>/environ
:显示进程的环境变量。/proc/<PID>/fd
:显示进程打开的文件描述符。
-
使用案例:
- 查看进程状态信息:
这将显示进程 ID 为 1234 的进程状态信息,包括进程的优先级、内存占用等。cat /proc/1234/status
- 查看进程状态信息:
Name
- 含义:进程的名称。
- 作用:标识进程运行的程序名称,例如
sshd
表示这是一个 SSH 服务守护进程。
Umask
- 含义:文件掩码(umask),用于设置进程创建文件时的默认权限。
- 作用:默认情况下,文件权限为
666
,目录权限为777
。umask
用于从这些默认权限中减去相应的权限。例如,0022
表示:- 文件权限:
666 - 022 = 644
(即-rw-r--r--
) - 目录权限:
777 - 022 = 755
(即drwxr-xr-x
)
- 文件权限:
State
- 含义:进程的当前状态。
- 作用:
R
:运行状态(Running),进程正在运行或在运行队列中等待运行。S
:睡眠状态(Sleeping),进程正在等待某些资源(如 I/O)或被挂起。D
:不可中断的睡眠状态(Disk Sleep),进程正在等待某些资源(如磁盘 I/O)且无法被中断。Z
:僵尸状态(Zombie),进程已经完成,但其父进程尚未读取其状态信息。T
:停止状态(Stopped),进程被挂起,通常是因为接收到信号(如SIGSTOP
)或资源不足。W
:唤醒状态(Waking),进程正在被唤醒。P
:挂起状态(Parked),进程被挂起,等待某些资源。I
:僵尸状态(Idle),进程处于空闲状态。
Tgid
- 含义:线程组 ID(Thread Group ID),通常与进程 ID 相同。
- 作用:用于标识线程组,多线程程序中所有线程的
tgid
相同。
Ngid
- 含义:命名空间组 ID(Namespace Group ID)。
- 作用:在使用命名空间的场景中,
ngid
用于标识命名空间组。0
表示该进程没有使用命名空间。
Pid
- 含义:进程 ID(Process ID)。
- 作用:唯一标识系统中的一个进程。
PPid
- 含义:父进程 ID(Parent Process ID)。
- 作用:标识创建该进程的父进程。
1
表示父进程是init
进程(PID 为 1)。
TracerPid
- 含义:跟踪进程 ID(Tracer Process ID)。
- 作用:如果进程被调试器跟踪,这里会显示调试器的进程 ID。
0
表示该进程没有被跟踪。
Uid
- 含义:用户 ID(User ID),分别表示:
- 实际用户 ID(Real UID)
- 有效用户 ID(Effective UID)
- 保存的用户 ID(Saved UID)
- 文件系统用户 ID(Filesystem UID)
- 作用:
0
表示该进程以root
用户运行。
Gid
- 含义:组 ID(Group ID),分别表示:
- 实际组 ID(Real GID)
- 有效组 ID(Effective GID)
- 保存的组 ID(Saved GID)
- 文件系统组 ID(Filesystem GID)
- 作用:
0
表示该进程属于root
组。
FDSize - 含义:文件描述符表的大小。
- 作用:表示该进程可以打开的最大文件描述符数量。
Groups
- 含义:进程所属的用户组列表。
- 作用:显示进程所属的所有用户组。这里为空,表示进程只属于
root
组。
NStgid
- 含义:命名空间中的线程组 ID。
- 作用:与
tgid
类似,但在命名空间中使用。
NSpid
- 含义:命名空间中的进程 ID。
- 作用:与
pid
类似,但在命名空间中使用。
NSpgid
- 含义:命名空间中的进程组 ID。
- 作用:与
pgid
类似,但在命名空间中使用。
NSsid
- 含义:命名空间中的会话 ID。
- 作用:与
sid
类似,但在命名空间中使用。
内存信息
VmPeak
- 含义:进程占用的虚拟内存峰值。
- 作用:表示进程在运行过程中达到的最大虚拟内存使用量。
VmSize
- 含义:进程当前占用的虚拟内存大小。
- 作用:表示进程当前使用的虚拟内存总量,包括代码段、数据段、堆、栈等。
VmLck
- 含义:锁定的内存大小。
- 作用:表示进程锁定的内存大小,锁定的内存不会被交换到磁盘。
VmPin
- 含义:固定在内存中的页面大小。
- 作用:表示进程固定在内存中的页面大小,这些页面不会被交换到磁盘。
VmHWM
- 含义:进程占用的物理内存峰值。
- 作用:表示进程在运行过程中达到的最大物理内存使用量。
VmRSS
- 含义:进程占用的物理内存大小(Resident Set Size)。
- 作用:表示进程当前实际占用的物理内存大小,包括代码段、数据段、堆、栈等。
RssAnon
- 含义:匿名内存的大小。
- 作用:表示进程占用的匿名内存大小,匿名内存是指没有映射到文件的内存,如堆和栈。
RssFile
- 含义:文件映射的内存大小。
- 作用:表示进程占用的文件映射内存大小,如共享库等。
RssShmem
- 含义:共享内存的大小。
- 作用:表示进程占用的共享内存大小。
VmData
- 含义:数据段的大小。
- 作用:表示进程的数据段大小,包括堆和栈。
VmStk
- 含义:栈的大小。
- 作用:表示进程的栈大小。
VmExe
- 含义:可执行文件的大小。
- 作用:表示进程的可执行文件大小。
VmLib
- 含义:共享库的大小。
- 作用:表示进程加载的共享库大小。
VmPTE
- 含义:页表条目的大小。
- 作用:表示进程的页表条目大小。
VmSwap
- 含义:交换空间的大小。
- 作用:表示进程占用的交换空间大小。
HugetlbPages
- 含义:大页内存的大小。
- 作用:表示进程占用的大页内存大小。
其他信息
CoreDumping
- 含义:是否正在生成核心转储文件。
- 作用:
0
表示进程没有正在生成核心转储文件。
Threads
- 含义:进程中的线程数量。
- 作用:表示该进程包含的线程数量。
SigQ
- 含义:信号队列的使用情况。
- 作用:
0/7606
表示当前信号队列中没有信号,最大信号队列大小为 7606。
SigPnd
- 含义:挂起的信号。
- 作用:表示进程当前挂起的信号掩码。
ShdPnd
- 含义:共享挂起的信号。
- 作用:表示进程共享挂起的信号掩码。
SigBlk
- 含义:阻塞的信号。
- 作用:表示进程当前阻塞的信号掩码。
SigIgn
- 含义:忽略的信号。
- 作用:表示进程当前忽略的信号掩码。
0000000000001000
表示进程忽略了一些信号。
SigCgt
- 含义:捕获的信号。
- 作用:表示进程当前捕获的信号掩码。
0000000180014005
表示进程捕获了一些信号。
CapInh
- 含义:继承的能力(Capabilities)。
- 作用:表示进程继承的能力掩码。
0000000000000000
表示没有继承任何能力。
CapPrm
- 含义:允许的能力(Capabilities)。
- 作用:表示进程允许的能力掩码。
0000003fffffffff
表示进程允许的能力。
CapEff
- 含义:有效的能力(Capabilities)。
- 作用:表示进程当前有效的能力掩码。
0000003fffffffff
表示进程当前有效的能力。
CapBnd
- 含义:边界的能力(Capabilities)。
- 作用:表示进程的能力边界掩码。
0000003fffffffff
表示进程的能力边界。
CapAmb
- 含义:环境的能力(Capabilities)。
- 作用:表示进程的环境能力掩码。
0000000000000000
表示没有环境能力。
NoNewPrivs
- 含义:是否禁止提升权限。
- 作用:
0
表示进程可以提升权限,1
表示禁止提升权限。
Seccomp
- 含义:安全计算模式(Seccomp)。
- 作用:
0
表示进程没有启用 Seccomp,1
表示启用了 Seccomp。
Speculation_Store_Bypass
- 含义:推测性存储旁路(Speculation Store Bypass)。
- 作用:表示进程是否易受推测性存储旁路攻击。
thread vulnerable
表示线程易受攻击。
Cpus_allowed
- 含义:允许运行的 CPU 核心。
- 作用:表示进程可以运行的 CPU 核心。
ffffffff,ffffffff,ffffffff,ffffffff
表示进程可以运行在所有 CPU 核心上。
Cpus_allowed_list
- 含义:允许运行的 CPU 核心列表。
- 作用:表示进程可以运行的 CPU 核心列表。
0-127
表示进程可以运行在 CPU 核心 0 到 127 上。
好的,接下来我将详细解释Mems_allowed_list
、voluntary_ctxt_switches
和nonvoluntary_ctxt_switches
这三个参数的含义和作用。
抱歉刚才的内容有些冗长了,现在我来详细解释一下 Mems_allowed
参数的含义和作用。
Mems_allowed
-
含义:允许访问的内存节点(Memory Nodes)。
-
作用:在 NUMA(Non-Uniform Memory Access)架构的系统中,内存被划分为多个节点(Node),每个节点对应一组物理内存。
Mems_allowed
表示进程可以访问的内存节点。Mems_allowed
的值是一个位掩码(bitmask),每个位对应一个内存节点。如果某一位为1
,表示进程可以访问该内存节点;如果为0
,则表示不能访问。
Mems_allowed_list
- 含义:允许访问的内存节点列表。
- 作用:在 NUMA(Non-Uniform Memory Access)架构的系统中,内存被划分为多个节点(Node),每个节点对应一组物理内存。
Mems_allowed_list
是一个更直观的表示,列出了进程可以访问的内存节点编号。
示例
在例子中:
Mems_allowed_list: 0
这表示进程只能访问内存节点 0。如果系统中有多个内存节点,例如 0 和 1,那么这里可能会显示 0-1
或 0,1
。
voluntary_ctxt_switches
- 含义:自愿上下文切换的次数。
- 作用:表示进程主动放弃 CPU 的次数。当进程主动调用
yield
或等待某些资源(如 I/O)时,会触发自愿上下文切换。
示例
在例子中:
voluntary_ctxt_switches: 44
这表示该进程已经主动放弃 CPU 44 次。
nonvoluntary_ctxt_switches
- 含义:非自愿上下文切换的次数。
- 作用:表示进程被操作系统强制剥夺 CPU 的次数。这通常发生在进程的时间片用完,或者有更高优先级的进程需要运行时。
示例
在例子中:
nonvoluntary_ctxt_switches: 17
这表示该进程被操作系统强制剥夺 CPU 17 次。
-
查看进程启动命令:
cat /proc/1234/cmdline
这将显示进程 ID 为 1234 的进程启动时的命令行参数。
-
查看进程环境变量:
cat /proc/1234/environ | tr '\0' '\n'
这将显示进程 ID 为 1234 的进程的环境变量。
-
查看进程打开的文件描述符:
ls /proc/1234/fd
这将列出进程 ID 为 1234 的进程打开的所有文件描述符。
10. 定时任务管理
10.1 at
命令
at
命令用于在指定时间运行命令或脚本。它可以帮助用户安排在特定时间执行的任务,例如定时备份或定时发送邮件。
-
语法:
at [选项] 时间
-
常用参数:
-f <文件>
:指定要执行的命令文件。-m
:在命令执行完成后发送邮件通知。-r <作业号>
:删除指定的作业。-l
:列出当前所有待执行的作业。
-
用户限制:
/etc/at.allow
:如果该文件存在,只有在文件中列出的用户才能使用at
和batch
命令。/etc/at.deny
:如果/etc/at.allow
文件不存在,系统会检查/etc/at.deny
文件。文件中列出的用户将被禁止使用at
和batch
命令。
-
管理限制文件:
-
允许特定用户使用
at
和batch
:echo "username" | sudo tee -a /etc/at.allow
这将允许指定用户使用
at
和batch
命令。 -
禁止特定用户使用
at
和batch
:echo "username" | sudo tee -a /etc/at.deny
这将禁止指定用户使用
at
和batch
命令。 -
查看当前的限制设置:
cat /etc/at.allow cat /etc/at.deny
这将显示当前的用户限制设置。
-
-
使用案例:
-
在指定时间运行命令:
echo "echo 'Hello, World!'" | at 14:30
这将在当天的 14:30 执行
echo 'Hello, World!'
命令。
-
运行脚本文件:
at -f /path/to/script.sh 14:30
这将在当天的 14:30 执行指定的脚本文件。
-
列出所有待执行的作业:
at -l
这将列出当前所有待执行的
at
作业。 -
删除作业:
at -r <作业号>
这将删除指定的
at
作业。
-
10.2 batch
命令
batch
命令用于在系统负载较低时运行命令或脚本。它可以帮助用户在系统资源较为充裕时执行任务,避免对系统性能造成过大影响。
-
语法:
batch [选项]
-
常用参数:
-f <文件>
:指定要执行的命令文件。-m
:在命令执行完成后发送邮件通知。
-
用户限制:
batch
命令的用户限制与at
命令相同,通过/etc/at.allow
和/etc/at.deny
文件进行控制。 -
使用案例:
-
在系统负载较低时运行命令:
echo "echo 'Hello, World!'" | batch
这将在系统负载较低时执行
echo 'Hello, World!'
命令。 -
运行脚本文件:
batch -f /path/to/script.sh
这将在系统负载较低时执行指定的脚本文件。
-
10.3 cron
与 crontab
命令
cron
是一个用于定期执行任务的守护进程,而 crontab
是用于管理 cron
任务的命令。它们可以帮助用户安排周期性任务,例如定时备份、定时清理日志等。
-
语法:
crontab [选项] [文件]
-
常用参数:
-e
:编辑当前用户的crontab
文件。-l
:列出当前用户的crontab
文件内容。-r
:删除当前用户的crontab
文件。-i
:在删除crontab
文件前进行确认。
-
用户限制:
/etc/cron.allow
:如果该文件存在,只有在文件中列出的用户才能使用crontab
命令。/etc/cron.deny
:如果/etc/cron.allow
文件不存在,系统会检查/etc/cron.deny
文件。文件中列出的用户将被禁止使用crontab
命令。
-
管理限制文件:
-
允许特定用户使用
crontab
:echo "username" | sudo tee -a /etc/cron.allow
这将允许指定用户使用
crontab
命令。 -
禁止特定用户使用
crontab
:echo "username" | sudo tee -a /etc/cron.deny
这将禁止指定用户使用
crontab
命令。 -
查看当前的限制设置:
cat /etc/cron.allow cat /etc/cron.deny
这将显示当前的用户限制设置。
-
-
crontab
文件格式:
crontab
文件的每一行代表一个定时任务,格式如下:* * * * * command
- 第一个
*
:分钟(0-59) - 第二个
*
:小时(0-23) - 第三个
*
:日期(1-31) - 第四个
*
:月份(1-12) - 第五个
*
:星期几(0-7,其中 0 和 7 都表示星期日)
- 第一个
-
使用案例:
-
编辑
crontab
文件:crontab -e
这将打开当前用户的
crontab
文件进行编辑。
在编辑器中添加以下内容:
# 每天凌晨 2 点运行备份脚本 0 2 * * * /path/to/backup.sh
这将在每天凌晨 2 点执行指定的备份脚本。
按下 Ctrl + O(字母 O,表示 Output),然后按 Enter 键保存文件。
按下 Ctrl + X 退出 nano 编辑器。 -
查看当前用户的
crontab
文件内容:crontab -l
这将列出当前用户的
crontab
文件内容。 -
删除当前用户的
crontab
文件:crontab -r
这将删除当前用户的
crontab
文件。
-
11. 综合案例:设置用户限制并创建 crontab
文件
步骤 1:设置用户限制
假设您希望只有 admin
用户可以使用 at
和 crontab
,其他用户则被禁止。
-
允许
admin
用户使用at
和crontab
:echo "admin" | sudo tee /etc/at.allow echo "admin" | sudo tee /etc/cron.allow
这将允许
admin
用户使用at
和crontab
命令。 -
禁止其他用户使用
at
和crontab
:sudo truncate -s 0 /etc/at.deny sudo truncate -s 0 /etc/cron.deny
这将清空
/etc/at.deny
和/etc/cron.deny
文件,从而禁止其他用户使用这些命令。
步骤 2:创建 crontab
文件
以 admin
用户身份创建 crontab
文件:
-
编辑
crontab
文件:crontab -e
这将打开当前用户的
crontab
文件进行编辑。在编辑器中添加以下内容:
# 每天凌晨 2 点运行备份脚本 0 2 * * * /path/to/backup.sh
这将在每天凌晨 2 点执行指定的备份脚本。
-
查看
crontab
文件内容:crontab -l
这将列出当前用户的
crontab
文件内容。
步骤 3:验证限制设置
-
验证
at
限制:sudo atq
这将列出当前所有待执行的
at
作业。
-
验证
crontab
限制:sudo crontab -l
这将列出当前用户的
crontab
文件内容。