学习目标
1、掌握定时任务的编写
2、掌握进程管理
3、掌握工作管理
一、定时任务
有了定时任务妈妈再也不用担心孩子熬夜了!!!
在linux中定时任务分为单次任务和循环多次任务,单次任务为任务执行一次就结束了,多次循环为任务会根据我提前设置好的时间循环多次执行,直到我们取消定时任务为止,在实际工作中多次循环使用的频率相比与单词执行的频率会高一些,比如日志备份,要求每天凌晨一点要执行,数据库文件备份要求每天定期进行备份,这些场景都会使用到定时任务功能,也刻印大大减轻系统管理者的难度。
1、at :单次执行
2、crontab :循环多次执行
3、anacron(知道就好,不常用)
要想使用 at 命令,读者需提前安装好 at 软件包,并开启 atd 服务。因此,首先来看看如何安装 at 软件包。
在 Linux 系统中,查看 at 软件包是否已安装,可以使用 rpm -q 命令,如下所示:
[root@localhost ~]# rpm -q at
package at is not installed
可以看到,当前系统未安装 at 软件包,可使用如下命令进行安装:
[root@localhost ~]# yum -y install at
开启at服务并加入开机自启动
[root@localhost ~]# systemctl enable --now atd
安装好 at 软件包并开启 atd 服务之后,at 命令才可以正常使用,不过在此之前,我们还要学习一下 at 命令的访问控制。
1)如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的)。
2) 如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
3)如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。
at命令的格式非常简单,语法结构
[root@localhost ~] # at [选项] [时间]
选项
-m : 工作完成是否输出,都e-mail通知执行at的用户
-c: 显示该at 工作实际内容
-t :时间 :指定提交工作并执行
-d :删除某个工作,需要提供对应的工作标识号(ID),同atrm命令
-l:查看当前存在等待运行的工作
-f 脚本文件:指定所要提交的脚本文件。
范例:
[user1@localhost ~]$ at 20:18 ##运行脚本
at> /home/user1/hello.sh >>/home/user1/log
at> <EOT>
job 3 at Sun Oct 03 20:18:00 2021
[user1@localhost ~]$ date
Sun Oct 03 20:18:08 CST 2021
[user1@localhost ~]$ ls
hello.sh log
[user1@localhost ~]$ vim log
[user1@localhost ~]$ ls
hello.sh log
[user1@localhost ~]$
[user1@ali01 root]$ at now +10 minutes ##10分钟后执行
at> echo test >/tmp/test.txt
at> <EOT>
Sun Oct 03 21:18:08 CST 2021
上述定时任务的意思是,在20:18分执行hello.sh的这个脚本,并将输出的日志追加到log这个文件中,定时任务使用ctrl +D保存
查看进程任务
at -c 进程号
不知道进程号的用下方命令查看
at -l
结束进程:
atrm 进程号
或者
at -d 进程号
例如:
[user1@localhost ~]$ atrm 6
[user1@localhost ~]$ atq #再查看就没有了。
2、
crontab:循环多次执行
前面学习了 at 命令,此命令在指定的时间仅能执行一次任务,但在实际工作中,系统的定时任务一般是需要重复执行的。而 at 命令显然无法满足需求,这是就需要使用 crontab 命令来执行循环定时任务。
在介绍 crontab 命令之前,我们首先要介绍一下 crond,因为 crontab 命令需要 crond 服务支持。crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,和 Windows 中的计划任务有些类似。
1.安装操作系统后,默认会安装crond
[root@localhost at]# systemctl status crond
2.没有,安装crond
[root@localhost at]# yum -y install crond
1) 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。
2) 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。
3) 这个规则基本和 at 命令的规则一致,同样是 /etc/cron.allow 文件比 /etc/cron.deny 文件的优先级高,Linux 系统中默认只有 /etc/cron.deny文件。
crontab 命令的基本格式如下:
[root@localhost ~]# crontab [选项] [file]
选项:
-e 编辑某个用户的crontab文件内容
-u user 用来定义crontad服务,例:“-u demo” 表示设备demo
-l 查看任务内容
-r 删除某个用户的crontab 文件
-i 删除给提示的
语法:
crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的任务
当“crontab -e”编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/ 目录中,每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效
举例说明:
| 时间 | 含义 |
| ------------------ | ------------------------------------------------------------ |
| 30 12 * * * 命令 | 代表在每天的12点30分执行命令 |
| 0 22 * * 2 命令 | 代表在每周2的22点执行命令 |
| */5 * * * * 命令 | 代表每过5分钟执行一次命令 |
| 40 4 * * 1-5 命令 | 代表在每周一到周五的凌晨 4 点 40 分执行命令 |
| 0 0 1,15 * 1 命令 | 代表每个月的1号,15号或者周1都会执行,但是不建议这样写,以免混淆 |
2.3系统配置文件
“crontab -e”是每个用户执行的命令,也就是说不同的用户身份可以执行自己定义的定时任务,但是有一些定时任务需要系统执行,这时就需要编辑/etc/crontab这个配置文件了。当然,并不是说写入/etc/crontab配置文件中的定时任务在执行的时候不需要用户身份,而是"cronta -e"命令定义定时任务时,默认执行的是当前登录用户,而修改/etc/crontab配置文件时,定时任务的身份是可以手动指定的,这种方式更加灵活,修改也更加方便,我们看下/etc/crontab这个文件
vim /etc/crontab
我们也可以通过修改配置文件的方式来添加定时任务
*/1 * * * * user1 echo user1 >/home/user1/user.txt #通过user1用户每分钟执行一次命令
打开任务文件
crontab -e
编写定时任务
五个 " * " + 执行的任务
范例1:让系统每隔 1 分钟就向 /tmp/test 文件中写入一行“11”,验证一下系统定时任务是否会执行
[root@localhost ~]#crontab -e
*/1 * * * * /bin/echo "11" >/tmp/test
[root@localhost at]# cd /tmp/
[root@localhost tmp]# ls
test
[root@localhost tmp]# cat test
11
范例2:让系统在每周日的凌晨 4 点 05 分重启一次。
[root@localhost ~]# crontab -e
05 04 * * 7 /sbin/shutdown -r now
范例3:让系统每天早上8点和晚上8点备份一下数据库文件
[root@localhost ~]# crontab -e
0 8,20 * * * /usr/mysql/bin/mysqldump -u root -h host -p dbname > backdb.sql
3、anacron
anacron 是用来做什么的呢?设想这样一个场景,Linux 服务器会在周末关机两天,但是设定的定时任务大多在周日早上进行,但在这个时间点,服务器又处于关机状态,导致系统很多定时任务无法运行。
又比如,我们需要在凌晨 5 点 05 分执行系统的日志备份,但 Linux 服务器不是 24 小时开机的,在晚上需要关机,白天上班之后才会再次开机,在这个定时任务的执行时间我们的服务器刚好没有开机,那么这个定时任务就不会执行了。anacron 就是用来解决这个问题的。
anacron命令的基本格式如下:
[root@localhost ~]# anacron [选项] [工作名]
选项 | 功能 |
---|---|
-f | 强制执行相关工作,忽略时间戳。 |
-u | 更新 /var/spool/anacron/cron.{daily,weekly,monthly} 文件中的时间戳为当前日期,但不执行任何工作。 |
-s | 依据 /etc/anacrontab 文件中设定的延迟时间顺序执行工作,在前一个工作未完成前,不会开始下一个工作。 |
-n | 立即执行 /etc/anacrontab 中所有的工作,忽略所有的延迟时间。 |
-q | 禁止将信息输出到标准错误,常和 -d 选项合用。 |
在当前的 Linux 中,其实不需要执行任何 anacron 命令,只需要配置好 /etc/anacrontab 文件,系统就会依赖这个文件中的设定来通过 anacron 执行定时任务了。那么,关键就是 /etc/anacrontab 文件的内容了。这个文件的内容如下:
[root@localhost ~]# vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
#前面的内容和/etc/crontab类似
#the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
#最大随机廷迟,如果有大量的未执行,如果开机后立即执行可能会严重影响性能
#the jobs will be started during the following hours only
START_H0URS_RANGE=3-22
#fanacron的执行时间范围是3:00~22:00
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
#每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行
7 25 cron.weekly nice run-parts /etc/cron.weekly
#每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,就会执行
©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
#每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没有被执行,那就执行
我们用 cron.daily 工作来说明一下 /etc/anacrontab 的执行过程:
1. 读取 /var/spool/anacron/cron.daily 文件中 anacron 上一次执行的时间。
2. 和当前时间比较,如果两个时间的差值超过 1 天,就执行 cron.daily 工作。
3. 只能在 03:00-22:00 执行这个工作。
4. 执行工作时强制延迟时间为 5 分钟,再随机延迟 0~45 分钟。
5. 使用 nice 命令指定默认优先级,使用 run-parts 脚本执行 /etc/cron.daily 目录中所有的可执行文件。
二、进程管理
1、什么是进程和程序
进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合。
这么讲很难理解,那我们换一种说法。程序是人使用计算机语言编写的,可以实现一定功能,并且可以执行的代码集合。而进程是正在执行中的程序。当程序被执行时,执行人的权限和属性,以及程序的代码都会被加载入内存,操作系统给这个进程分配一个 ID,称为 PID(进程 ID)。
也就是说,在操作系统中,所有可以执行的程序与命令都会产生进程。只是有些程序和命令非常简单,如 ls 命令、touch 命令等,它们在执行完后就会结束,相应的进程也就会终结,所以我们很难捕捉到这些进程。但是还有一些程和命令,比如 httpd 进程,启动之后就会一直驻留在系统当中,我们把这样的进程称作常驻内存进程。
某些进程会产生一些新的进程,我们把这些进程称作子进程,而把这个进程本身称作父进程。比如,我们必须正常登录到 Shell 环境中才能执行系统命令,而 Linux 的标准 Shell 是 bash。我们在 bash 当中执行了 ls 命令,那么 bash 就是父进程,而 ls 命令是在 bash 进程中产生的进程,所以 ls 进程是 bash 进程的子进程。也就是说,子进程是依赖父进程而产生的,如果父进程不存在,那么子进程也不存在了。
2、 进程管理的作用
在使用 Windows 系统的过程中,使用任务管理器,很大程度上是为了强制关闭“未反应”的软件,也就是杀死进程。的确,这是很多使用进程管理工具或进程管理命令的人最常见的使用方法。不过,杀死进程(强制中止进程)只是进程管理工作中最不常用的手段,因为每个进程都有自己正确的结束方法,而杀死进程是在正常方法已经失效的情况下的后备手段。
那么,进程管理到底应该是做什么的呢?进程管理主要有以下 3 个作用。
1) 判断服务器的健康状态
运维工程师最主要的工作就是保证服务器安全、稳定地运行。理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,就人为干预解决了问题。
进程管理最主要的工作就是判断服务器当前运行是否健康,是否需要人为干预。如果服务器的 CPU 占用率、内存占用率过高,就需要人为介入解决问题了。这又出现了一个问题,我们发现服务器的 CPU 或内存占用率很高,该如何介入呢?是直接终止高负载的进程吗?
当然不是,应该判断这个进程是否是正常进程,如果是正常进程,则说明你的服务器已经不能满足应用需求,你需要更好的硬件或搭建集群了;如果是非法进程占用了系统资源,则更不能直接中止进程,而要判断非法进程的来源、作用和所在位置,从而把它彻底清除。
当然,如果服务器数量很少,我们完全可以人为通过进程管理命令来进行监控与干预,但如果服务器数量较多,那么人为手工监控就变得非常困难了,这时我们就需要相应的监控服务,如 cacti 或 nagios。总之,进程管理工作中最重要的工作就是判断服务器的健康状 态,最理想的状态是服务器宕机之前就解决问题,从而避免服务器的宕机。
2) 查看系统中所有的进程
我们需要查看看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务、是否有非法服务在运行。
3) 杀死进程
这是进程管理中最不常用的手段。当需要停止服务时,会通过正确关闭命令来停止服务(如 apache 服务可以通过 service httpd stop 命令来关闭)。只有在正确终止进程的手段失效的情况下,才会考虑使用 kill 命令杀死进程
在 Linux 系统中,每个进程都有一个唯一的进程号(PID),方便系统识别和调度进程。通过简单地输出运行程序的程序名,就可以运行该程序,其实也就是启动了一个进程。
总体来说,启动一个进程主要有 2 种途径,分别是通过手工启动和通过调度启动(事先进行设置,根据用户要求,进程可以自行启动),接下来就一一介绍这 2 中方式。
3、Linux手工启动进程
手工启动进程指的是由用户输入命令直接启动一个进程,根据所启动的进程类型和性质的不同,其又可以细分为前台启动和后台启动 2 种方式。
3.1 前台启动进程
这是手工启动进程最常用的方式,因为当用户输入一个命令并运行,就已经启动了一个进程,而且是一个前台的进程,此时系统其实已经处于一个多进程的状态(一个是 Shell 进程,另一个是新启动的进程)。
假如启动一个比较耗时的进程,然后再把该进程挂起,并使用 ps 命令查看,就会看到该进程在 ps 显示列表中,将进程挂起,指的是将前台运行的进程放到后台,并且暂停其运行
[root@localhost tmp]# ping www.baidu.com PING www.a.shifen.com (112.80.248.75) 56(84) bytes of data. 64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=1 ttl=128 time=24.2 ms 64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=2 ttl=128 time=20.4 ms 64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=3 ttl=128 time=21.1 ms 64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=4 ttl=128 time=46.2 ms 64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=5 ttl=128 time=21.3 ms ^Z [1]+ Stopped ping www.baidu.com [root@localhost tmp]# ps PID TTY TIME CMD 1464 pts/0 00:00:00 bash 4518 pts/0 00:00:00 ping 4529 pts/0 00:00:00 ps
通过运行 ps 命令查看进程信息,可以看到,刚刚执行的 ping命令的进程号为 4518,同时 ps 进程的进程号为 4529
3.2 后台启动进程
进程直接从后台运行,用的相对较少,除非该进程非常耗时,且用户也不急着需要其运行结果的时候,例如,用户需要启动一个需要长时间运行的格式化文本文件的进程,为了不使整个 Shell 在格式化过程中都处于“被占用”状态,从后台启动这个进程是比较明智的选择。
从后台启动进程,其实就是在命令结尾处添加一个 " &" 符号(注意,& 前面有空格)。输入命令并运行之后,Shell 会提供给我们一个数字,此数字就是该进程的进程号。然后直接就会出现提示符,用户就可以继续完成其他工作,例如:
[root@localhost tmp]# nohup ping www.baidu.com & [3] 4759
其中【3】是工作号,4759是进程号
以上介绍了手工启动的 2 种方式,实际上它们有个共同的特点,就是新进程都是由当前 Shell 这个进程产生的,换句话说,是 Shell 创建了新进程,于是称这种关系为进程间的父子关系,其中 Shell 是父进程,新进程是子进程。
值得一提的是,一个父进程可以有多个子进程,通常子进程结束后才能继续父进程;当然,如果是从后台启动,父进程就不用等待子进程了。
4 、查看正在运行的进程
ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息。
ps 命令有多种不同的使用方法,这常常给初学者带来困惑。在各种 Linux 论坛上,询问 ps 命令语法的帖子屡见不鲜,而出现这样的情况,还要归咎于 UNIX 悠久的历史和庞大的派系。在不同的 Linux 发行版上,ps 命令的语法各不相同,为此,Linux 采取了一个折中的方法,即融合各种不同的风格,兼顾那些已经习惯了其它系统上使用 ps 命令的用户。
ps 命令的基本格式如下:
[root@localhost ~]# ps -aux #查看系统中所有的进程,使用 BSD 操作系统格式 [root@localhost ~]# ps -le #查看系统中所有的进程,使用 Linux 标准命令格式 [root@localhost ~]# ps -ef
选项:
a:显示一个终端的所有进程,除会话引线外; u:显示进程的归属用户及内存的使用情况; x:显示没有控制终端的进程; l:长格式显示更加详细的信息; e:显示所有进程;
大家如果执行 "man ps" 命令,则会发现 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。所以,我建议大家记忆几个固定选项即可。比如:
① "ps aux" 可以查看系统中所有的进程; ② "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级; ③ "ps -l" 只能看到当前 Shell 产生的进程;
有这三个命令就足够了,下面分别来查看。
持续监听进程运行状态
[root@localhost ~]#top [选项]
选项:
-d: 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
-b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
-n: 次数:指定 top 命令执行的次数。一般和"-"选项合用;
-p: 进程PID:仅查看指定 ID 的进程;
-s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
-u: 用户名:只监听某个用户的进程;
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
- ? 或 h:显示交互模式的帮助;
- P:按照 CPU 的使用率排序,默认就是此选项;
- M:按照内存的使用率排序;
- N:按照 PID 排序;
- T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
- k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
- r:按照 PID 给某个进程重设优先级(Nice)值;
- q:退出 top 命令;
执行sync可以将内存同步到硬盘上
[root@localhost tmp]# sync
优先级查看:PR NI 越小越先
Linux常用信号(进程间通信)及其含义
进程的管理主要是指进程的关闭与重启。我们一般关闭或重启软件,都是关闭或重启它的程序,而不是直接操作进程的。比如,要重启 apache 服务,一般使用命令"service httpd restart"重启 apache的程序。
那么,可以通过直接管理进程来关闭或重启 apache 吗?答案是肯定的,这时就要依赖进程的信号(Signal)了。我们需要给予该进程号,告诉进程我们想要让它做什么。
系统中可以识别的信号较多,我们可以使用命令"kill -l"或"man 7 signal"来查询。命令如下
[root@ali01 ~]# kill -l
记住1,9 ,15
1:对内存中的数据进行重载,pid不会变化
9:暴力杀进程,不能被终止,在生成中慎用,会出现脏数据(不允许用)
15:优雅杀进程,可以被忽略。
7、 终止进程
[root@localhost ~]# kill [信号] PID
##### 终止特定的一类进程:killall
killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。
killall 命令的基本格式如下:
[root@localhost ~]# killall [选项] [信号] 进程名
三、工作管理
工作管理指的是在单个登录终端(也就是登录的 Shell 界面)同时管理多个工作的行为。也就是说,我们登陆了一个终端,已经在执行一个操作,那么是否可以在不关闭当前操作的情况下执行其他操作呢?
当然可以,我们可以再启动一个终端,然后执行其他的操作。不过,是否可以在一个终端执行不同的操作呢?这就需要通过工作管理来实现了。
例如,我在当前终端正在 vi 一个文件,在不停止 vi 的情况下,如果我想在同一个终端执行其他的命令,就应该把 vi 命令放入后台,然后再执行其他命令。把命令放入后台,然后把命令恢复到前台,或者让命令恢复到后台执行,这些管理操作就是工作管理。
后台管理有几个事项需要大家注意:
1. 前台是指当前可以操控和执行命令的这个操作环境;后台是指工作可以自行运行,但是不能直接用 Ctrl+C 快捷键来中止它,只能使用 fg/bg 来调用工作。 2. 当前的登录终端只能管理当前终端的工作,而不能管理其他登录终端的工作。比如 tty1 登录的终端是不能管理 tty2 终端中的工作的。 3. 放入后台的命令必须可以持续运行一段时间,这样我们才能捕捉和操作它。 4. 放入后台执行的命令不能和前台用户有交互或需要前台输入,否则只能放入后台暂停,而不能执行。比如 vi 命令只能放入后台暂停,而不能执行,因为 vi 命令需要前台输入信息;top 命令也不能放入后台执行,而只能放入后台暂停,因为 top 命令需要和前台交互
1、 Linux命令放入后台运行
Linux 命令放入后台的方法有两种,分别介绍如下。
第一种:"命令 &",把命令放入后台执行
第一种把命令放入后台的方法是在命令后面加入 空格 &
。使用这种方法放入后台的命令,在后台处于执行状态。
注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的
[root@ali01 ~]# ping www.baidu.com >>/dev/null & [1] 3252
第二种:使用ctrl +Z的方式放入后台,此时进程时暂停的。
[root@ali01 ~]# ping www.baidu.com PING www.wshifen.com (119.63.197.139) 56(84) bytes of data. 64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=1 ttl=54 time=3.40 ms 64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=2 ttl=54 time=3.44 ms 64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=3 ttl=54 time=3.43 ms ^Z [1]+ Stopped ping www.baidu.com
2、查看当前终端放入后台的工作:jobs
jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。
jobs 命令的基本格式如下:
[root@localhost ~]#jobs [选项]
表 1 罗列了 jobs 命令常用的选项及含义。
选项 | 含义 |
---|---|
-l(L 的小写) | 列出进程的 PID 号。 |
-n | 只列出上次发出通知后改变了状态的进程。 |
-p | 只列出进程的 PID 号。 |
-r | 只列出运行中的进程。 |
-s | 只列出已停止的进程。 |
范例1:
[root@ali01 ~]# jobs [1]+ Running ping www.baidu.com >> /dev/null &
可以看到,当前终端有1个后台工作:一个是 ping 命令,工作号为 1,状态是运行;"+"号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作,-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"+-"标志了。
3、 把后台命令恢复在前台执行:fg
前面所讲,都是将工作丢到后台去运行,那么,有没有可以将后台工作拿到前台来执行的办法呢?答案是肯定的,使用 fg 命令即可。
fg 命令用于把后台工作恢复到前台执行,该命令的基本格式如下:
[root@localhost ~]#fg %工作号
注意,在使用此命令时,% 可以省略,但若将% 工作号
全部省略,则此命令会将带有 + 号的工作恢复到前台。另外,使用此命令的过程中, % 可有可无。
例如:
[root@ali01 ~]# fg 1 ping www.baidu.com >> /dev/null
4、 把后台暂停的工作恢复到后台执行:bg
前面讲过,使用 Ctrl+Z
快捷键的方式,可以将前台工作放入后台,但是会处于暂停状态,那么,有没有办法可以让后台工作继续在后台执行呢?答案是肯定的,这就需要用到 bg 命令。
bg 命令的基本格式如下:
[root@localhost ~]# bg %工作号
和 fg 命令类似,这里的 % 可以省略。
例如:
[root@ali01 ~]# ping www.baidu.com
PING www.wshifen.com (119.63.197.139) 56(84) bytes of data.
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=1 ttl=54 time=3.36 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=2 ttl=54 time=3.38 ms
^Z
[1]+ Stopped ping www.baidu.com
[root@ali01 ~]# bg 1
[1]+ ping www.baidu.com &
[root@ali01 ~]# 64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=3 ttl=54 time=3.42 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=4 ttl=54 time=3.38 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=5 ttl=54 time=3.39 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=6 ttl=54 time=3.47 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=7 ttl=54 time=3.41 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=8 ttl=54 time=3.43 ms
64 bytes from 119.63.197.139 (119.63.197.139): icmp_seq=9 ttl=54 time=3.37 ms