进程和计划任务

263 阅读25分钟

1、程序

1.1什么是程序?

  • 是一组计算机能识别和执行的指令,是一个指令序列,运行于电子计算机上,满足人们某种需求的信息化工具

2、进程

2.1什么是进程

运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位

  • 进程ID(Process ID,PID)号码被用来标记各个进程
  • UID、GID、和SELinux语境决定对文件系统的存取和访问权限
  • 通常从执行进程的用户来继承
  • 存在生命周期
  • 都由其父进程创建

2.2进程具有的特征:

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
  • 并发性:任何进程都可以同其他进程一起并发执行;
  • 独立性:进程是系统进行资源分配和调度的一个独立单位;
  • 结构性:进程由程序、数据和进程控制块三部分组成。

2.3线程

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,[文件描述符]和[信号处理]等等。但同一进程中的多个线程有各自的[调用栈](call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

一个进程可以有很多线程,每条线程并行执行不同的任务。

在多核或多[CPU],或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用[多线程技术]也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。

区别

线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位; 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线; 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进 程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见; 调度和切换:线程上下文切换比进程上下文切换要快得多

3进程管理相关命令

进程的管理主要是指进程的关闭与重启。我们一般关闭或重启软件,都是关闭或重启它的程序,而不是直接操作进程的。比如,要重启 apache 服务,一般使用命令"service httpd restart"重启 apache的程序。systemctl httpd start

那么,可以通过直接管理进程来关闭或重启 apache 吗?答案是肯定的,这时就要依赖进程的信号(Signal)了。我们需要给予该进程 信号,告诉进程我们想要让它做什么。

系统中可以识别的信号较多,我们可以使用命令"kill -l"或"man 7 signal"来查询

代号信号名称说 明
1SIGHUP该信号让进程立即关闭.然后重新读取配置文件之后重启
2SIGINT程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键
3SIGQUIT退出
8SIGFPE在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误
9SIGKILL用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程
14SIGALRM时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号
15SIGTERM正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9
18SIGCONT该信号可以让暂停的进程恢复执行。本信号不能被阻断
19SIGSTOP该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断

3.1ps命令

ps 即 process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录下的各文件中

查看静态的进程统计信息

支持三种选项:

  1. UNIX选项 如: -A -e
  2. GNU选项 如: --help
  3. BSD选项 如: a
  • "ps aux" 可以查看系统中所有的进程;
  • "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
  • "ps -l" 只能看到当前 Shell 产生的进程;

常用选项

  • a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
  • u:使用以用户为主的格式输出进程信息。
  • x:显示当前用户在所有终端下的进程信息。
  • -e:显示系统内的所有进程信息。
  • -l:使用长(Long)格式显示进程信息。
  • -f:使用完整的(Full)格式显示进程信
  • k|--sort 属性 对属性排序,属性前加 - 表示倒序

ps aux

表头含义
USER该进程是由哪个用户产生的。
PID进程的 ID。
%CPU该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。
%MEM该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。
VSZ该进程占用虚拟内存的大小,单位为 KB。
RSS该进程占用实际物理内存的大小,单位为 KB。
TTY该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。
STAT进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒。
-T:停止状态,可能是在后台暂停或进程处于除错状态。
-W:内存交互状态(从 2.6 内核开始无效)。
-X:死掉的进程(应该不会出现)。
-Z:僵尸进程。进程已经中止,但是还是占用硬件资源。
-<:高优先级(以下状态在 BSD 格式中出现)。
-N:低优先级。
-L:被锁入内存。
-s:包含子进程。
-l:多线程(小写 L)。
-+:位于后台。
START该进程的启动时间。
TIME该进程占用 CPU 的运算时间,注意不是系统时间。
COMMAND产生此进程的命令名。

ps -le 命令输出信息

表头含义
F进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限;
S进程状态。具体的状态和"psaux"命令中的 STAT 状态一致;
UID运行此进程的用户的 ID;
PID进程的 ID;
PPID父进程的 ID;
C该进程的 CPU 使用率,单位是百分比;
PRI进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改
NI进程的优先级,数值越小,该进程越早被执行;可以人为修改
ADDR该进程在内存的哪个位置;
SZ该进程占用多大内存;
WCHAN该进程是否运行。"-"代表正在运行;
TTY该进程由哪个终端产生;
TIME该进程占用 CPU 的运算时间,注意不是系统时间;
CMD产生此进程的命令名;

3.2top命令

ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。

为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

选项:

  • -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
  • -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
  • -n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
  • -p 进程PID:仅查看指定 ID 的进程;
  • -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
  • -u 用户名:只监听某个用户的进程;

在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:

  • ? 或 h:显示交互模式的帮助;
  • c:按照 CPU 的使用率排序,默认就是此选项;
  • M:按照内存的使用率排序;
  • N:按照 PID 排序;
  • T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
  • k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
  • r:按照 PID 给某个进程重设优先级(Nice)值;
  • q:退出 top 命令;

top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。命令的输出主要分为两部分:

  1. 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;
  2. 第二部分从第六行开始,显示的是系统中进程的信息;

3.2.1第一部分

[root@localhost ~]# top
top - 21:07:12 up 5 min,  2 users,  load average: 0.01, 0.11, 0.06
Tasks: 207 total,   1 running, 206 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3865308 total,  2627488 free,   700496 used,   537324 buff/cache
KiB Swap:  8388604 total,  8388604 free,        0 used.  2871848 avail Mem

第一行为任务队列信息,具体内容如表

内 容说 明
12:26:46系统当前时间
up 1 day, 13:32系统的运行时间.本机己经运行 1 天 13 小时 32 分钟
2 users当前登录了两个用户
load average: 0.00,0.00,0.00系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数)

第二行为进程信息,具体内容如表

内 容说 明
Tasks: 95 total系统中的进程总数
1 running正在运行的进程数
94 sleeping睡眠的进程数
0 stopped正在停止的进程数
0 zombie僵尸进程数。如果不是 0,则需要手工检查僵尸进程

第三行为 CPU 信息,具体内容如表

内 容说 明
Cpu(s): 0.1 %us用户模式占用的 CPU 百分比
0.1%sy系统模式占用的 CPU 百分比
0.0%ni改变过优先级的用户进程占用的 CPU 百分比
99.7%id空闲 CPU 占用的 CPU 百分比
0.1%wa等待输入/输出的进程占用的 CPU 百分比
0.0%hi硬中断请求服务占用的 CPU 百分比
0.1%si软中断请求服务占用的 CPU 百分比
0.0%stst(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

第四行为物理内存信息,具体内容如表buff cache

内 容说 明
Mem: 625344k total物理内存的总量,单位为KB
571504k used己经使用的物理内存数量
53840k&ee空闲的物理内存数量。我们使用的是虚拟机,共分配了 628MB内存,所以只有53MB的空闲内存
65800k buffers作为缓冲的内存数量

第五行为交换分区(swap)信息

内 容说 明
Swap: 524280k total交换分区(虚拟内存)的总大小
Ok used已经使用的交换分区的大小
524280k free空闲交换分区的大小
409280k cached作为缓存的交换分区的大小

通过 top 命令的第一部分就可以判断服务器的健康状态。如果 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。

这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存),或者建立集群服务器。

缓冲(buffer)和缓存(cache)的区别:

  • 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
  • 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。

3.2.2第二部分

top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

  • PID:进程的 ID。
  • USER:该进程所属的用户。
  • PR:优先级,数值越小优先级越高。
  • NI:优先级,数值越小、优先级越高。
  • VIRT:该进程使用的虚拟内存的大小,单位为 KB。
  • RES:该进程使用的物理内存的大小,单位为 KB。
  • SHR:共享内存大小,单位为 KB。
  • S:进程状态。
  • %CPU:该进程占用 CPU 的百分比。
  • %MEM:该进程占用内存的百分比。
  • TIME+:该进程共占用的 CPU 时间。
  • COMMAND:进程的命令名。
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W

[root@test ~]# top
top - 09:36:19 up  1:02,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 157 total,   1 running, 156 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 25.9/2031912  [|||||||||||||||||                                                  ]
KiB Swap:  0.0/2097148  [ 

top命令栏位信息简介
us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间


top选项:
-d # 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
-H   线程模式

3.3pgrep命令

查看指定的进程

  • -U 指定用户
  • -l: 显示进程名
  • -a: 显示完整格式的进程名
  • -P pid: 显示指定进程的子进程
[root@localhost ~]# pgrep -l "log"     #### 显示进程名
426 xfs-log/dm-0
652 xfs-log/sda1
732 systemd-logind
737 rsyslogd
749 abrt-watch-log
756 abrt-watch-log

[root@test ~]# pgrep -l -U zhangsan
###指定用户

3.4pstree命令

以树形结构列出进程信息

pstree   [OPTION] [ PID | USER ]                                                                                                                                                                                                                                                                                                                                                                 
常用选项
-a	显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其前辈进程
[root@localhost ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─alsactl
        ├─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
        ├─bluetoothd
        ├─chronyd
        ├─colord───2*[{colord}]
        ├─crond
        ├─cupsd
        ├─2*[dbus-daemon───{dbus-daemon}]
        ├─dbus-launch
        ├─dconf-service───2*[{dconf-service}]
        ├─dnsmasq───dnsmasq
        ├─evolution-addre─┬─evolution-addre───5*[{evolution-addre}]
        │                 └─5*[{evolution-addre}]
        ├─evolution-calen─┬─evolution-calen───5*[{evolution-calen}]
        │                 ├─evolution-calen───7*[{evolution-calen}]
        │                 └─5*[{evolution-calen}]
        ├─evolution-sourc───4*[{evolution-sourc}]
        ├─firewalld───{firewalld}
        ├─gdm─┬─X───5*[{X}]
        │     ├─gdm-session-wor─┬─gnome-session-b─┬─abrt-applet───2*[{abrt-applet}]
        │     │                 │                 ├─gnome-settings-───4*[{gnome-settings-}]
        │     │                 │                 ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │     │                 │                 │             │             ├─ibus-engine-sim───2*[{ibus-engine-sim}]
        │     │                 │                 │             │             └─2*[{ibus-daemon}]
        │     │                 │                 │             └─13*[{gnome-shell}]
        │     │                 │                 ├─gnome-software───3*[{gnome-software}]
        │     │                 │                 ├─nautilus-deskto───3*[{nautilus-deskto}]
        │     │                 │                 ├─seapplet
        │     │                 │                 ├─ssh-agent
        │     │                 │                 ├─tracker-extract───13*[{tracker-extract}]
        │     │                 │                 ├─tracker-miner-a───3*[{tracker-miner-a}]
        │     │                 │                 ├─tracker-miner-f───3*[{tracker-miner-f}]
        │     │                 │                 ├─tracker-miner-u───3*[{tracker-miner-u}]
        │     │                 │                 └─3*[{gnome-session-b}]
        │     │                 └─2*[{gdm-session-wor}]
        │     └─3*[{gdm}]
        ├─gnome-keyring-d───3*[{gnome-keyring-d}]
        ├─gnome-shell-cal───6*[{gnome-shell-cal}]
        ├─goa-daemon───4*[{goa-daemon}]
        ├─goa-identity-se───3*[{goa-identity-se}]
        ├─gsd-printer───2*[{gsd-printer}]
        ├─gssproxy───5*[{gssproxy}]
        ├─gvfs-afc-volume───3*[{gvfs-afc-volume}]
        ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]
        ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]
        ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]
        ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
        ├─gvfsd───2*[{gvfsd}]
        ├─gvfsd-fuse───5*[{gvfsd-fuse}]
        ├─gvfsd-metadata───2*[{gvfsd-metadata}]
        ├─gvfsd-trash───2*[{gvfsd-trash}]
        ├─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │             └─2*[{ibus-daemon}]
        ├─2*[ibus-x11───2*[{ibus-x11}]]
        ├─irqbalance
        ├─ksmtuned───sleep
        ├─libvirtd───15*[{libvirtd}]
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mission-control───3*[{mission-control}]
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───5*[{polkitd}]
        ├─pulseaudio───2*[{pulseaudio}]
        ├─rngd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─smartd
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tracker-store───7*[{tracker-store}]
        ├─tuned───4*[{tuned}]
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─vmtoolsd───{vmtoolsd}
        ├─vmtoolsd
        ├─wpa_supplicant
        └─xdg-permission-───2*[{xdg-permission-}]

3.5 lsof

lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。

lsof [选项]
选项功能
-c 字符串只列出以字符串开头的进程打开的文件。
+d 目录名列出某个目录中所有被进程调用的文件。
-u 用户名只列出某个用户的进程打开的文件。
-p pid列出某个 PID 进程打开的文件。

3.6监控系统资源vmstat

如果你想动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。

vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息

[root@localhost ~]# vmstat [-a] [刷新延时 刷新次数]
[root@localhost ~]# vmstat [选项] 


[root@localhost proc]# vmstat 1 3
#使用vmstat检测,每隔1秒刷新一次,共刷新3次

4进程启动方式

4.1手动启动

  • 前台启动
  • 后台启动

Linux 命令放入后台的方法有两种,分别介绍如下。

"命令 &",把命令放入后台执行

第一种把命令放入后台的方法是在命令后面加入 空格 &。使用这种方法放入后台的命令,在后台处于执行状态。

注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的

4.2 结束进程

4.2.1 kill

kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。

也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。

kill [信号] PID kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,读者可以使用 kill -l 命令查看所有信号及其编号,这里仅列出几个常用的信号

信号编号信号名含义
0EXIT程序退出时收到该信息。
1HUP挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。
2INT表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。
3QUIT退出。
9KILL杀死进程,即强制结束进程。
11SEGV段错误。
15TERM正常结束进程,是 kill 命令的默认信号。

4.2.2 killall

killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用

killall [选项] [信号] 进程名

  • -i:交互式,询问是否要杀死某个进程;
  • -I:忽略进程名的大小写;
killall -i sshd
#交互杀死 sshd

4.2.3pkill

当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程

pkill [信号] 进程名

信号编号信号名含义
0EXIT程序退出时收到该信息。
1HUP挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。
2INT表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。
3QUIT退出。
9KILL杀死进程,即强制结束进程。
11SEGV段错误。
15TERM正常结束进程,是 kill 命令的默认信号。

pkill命令踢出登陆用户

 pkill [-t 终端号] 进程名
 
-U:根据进程所属的用户名终止相应进程
-t:根据进程所在的终端终止相应进程

使用 killall 命令时,不知道大家发现没有,通过 killall 命令杀死 sshd 进程的方式来踢出用户,非常容易误杀死进程,要么会把 sshd 服务杀死,要么会把自己的登录终端杀死。

所以,不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会

5一次性任务

5.1at

at 工具

  1. 由包 at 提供
  2. 依赖与atd服务,需要启动才能实现at任务
  3. at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下
  4. 执行任务时PATH变量的值和当前定义任务的用户身份一致

at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:

  • 如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的)。
  • 如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
  • 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。

系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 命令。不过,如果我们打算控制用户的 at 命令权限,那么只需把用户写入 /etc/at.deny 文件即可

at [option] TIME
at [选项] [时间]
[HH:MM]  [yyyy-mm-dd]

HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00    
HH:MM YYYY-MM-DD   规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2016-09-20   
HH:MM[am|pm] [Month] [Date]
06pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该
项任务
now + 5 min 
02pm + 3 days


[root@localhost ~]# rpm -q at
at-3.1.13-20.el7x86_64

[root@localhost ~]# atq
9 2013-07-26 02:00 a root
#说明root用户有一个at任务在2013年7月26日02:00执行,工作号是9
[root@localhost ~]# atrm [工作号]
#删除指定的at任务

格式用法
HH:MM比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。
Midnight(midnight)代表 12:00 AM(也就是 00:00)。
Noon(noon)代表 12:00 PM(相当于 12:00)。
Teatime(teatime)代表 4:00 PM(相当于 16:00)。
英文月名 日期 年份比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。
MMDDYY、MM/DD/YY、MM.DD.YY比如 011518 表示 2018 年 1 月 15 号。
now+时间以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。
[root@test ~]# at 10:50 2021-07-12
at> touch /opt/file{a..z}.txt <EOT>       //ctrl+d提交 
job 2 at Mon Jul 12 10:50:00 2021
[root@test ~]# atq
2	Mon Jul 12 10:50:00 2021 a root

[root@localhost opt]#at now+1min
at> echo $PATH >/data/path<EOT>
job 3 at Wed Mar  2 01:42:00 2022

5.2 crontab

[root@localhost ~]# systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 三 2022-03-30 21:02:21 CST; 24min ago
 Main PID: 1154 (crond)
   CGroup: /system.slice/crond.service
           └─1154 /usr/sbin/crond -n

3月 30 21:02:21 localhost.localdomain systemd[1]: Started Command Scheduler.
3月 30 21:02:21 localhost.localdomain systemd[1]: Starting Command Scheduler...
3月 30 21:02:21 localhost.localdomain crond[1154]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 37% if used.)
3月 30 21:02:21 localhost.localdomain crond[1154]: (CRON) INFO (running with inotify support)
选项功能
-u user用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。
-e编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i在删除用户的 crontab 文件时,给确认提示。
[root@localhost ~]# cat /etc/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 zhnagsan -e  
#注意权限

*/2 * * * *  /usr/bin/cp /etc/passwd  /opt/
#每两分钟执行脚本


PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
*/2 * * * *  /usr/bin/cp /etc/passwd  /opt/

在书写 crontab 定时任务时,需要注意以下几个事项:

  • 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
  • crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。