zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux &用法和jobs命令

Linuxamp命令 用法 Jobs
2023-09-14 09:01:46 时间

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


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

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

[root@localhost ~]#find / -name install.log &
[1] 1920
#[工作号] 进程号
#把find命令放入后台执行,每个后台命令会被分配一个工作号。命令既然可以执行,就会有进程产生,所以也会有进程号

这样,虽然 find 命令在执行,但在当前终端仍然可以执行其他操作。如果在终端上出现如下信息:

[1]+ Done find / -name install.log

证明后台的这个命令已经完成了。当然,命令如果有执行结果,则也会显示到操作终端上。其中,[1] 是这个命令的工作号,"+"代表这个命令是最近一个被放入后台的。

命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态,使用这种方法放入后台的命令,就算不和前台有交互,能在后台执行,也处于暂停状态,因为 Ctrl+Z 快捷键就是暂停的快捷键

 

【例 1】

[root@localhost ~]#top
#在top命令执行的过程中,按下Ctrl+Z快捷键
[1]+ Stopped top
#top命令被放入后台,工作号是1,状态是暂停。而且,虽然top命令没有结束,但也能取得控制台权限

【例 2】

[root@localhost ~]# tar -zcf etc.tar.gz /etc
#压缩一下/etc/目录
tar:从成员名中删除开头的"/"
tar:从硬链接目标中删除开头的"/"
^Z
#在执行过程中,按下Ctrl+Z快捷键
[2]+ Stopped tar-zcf etc.tar.gz/etc
#tar命令被放入后台,工作号是2,状态是暂停

每个被放入后台的命令都会被分配一个工作号。第一个被放入后台的命令,工作号是 1;第二个被放入后台的命令,工作号是 2,以此类推。

 

jobs 命令


jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。jobs 命令的基本格式如下:

[root@localhost ~]#jobs [选项]

表 1 罗列了 jobs 命令常用的选项及含义。

表 1 jobs 命令常用选项及含义、
选项含义
-l(L 的小写)列出进程的 PID 号。
-n只列出上次发出通知后改变了状态的进程。
-p只列出进程的 PID 号。
-r只列出运行中的进程。
-s只列出已停止的进程。


例如:

[root@localhost ~]#jobs -l
[1]- 2023 Stopped top
[2]+ 2034 Stopped tar -zcf etc.tar.gz /etc

可以看到,当前终端有两个后台工作:一个是 top 命令,工作号为 1,状态是暂停,标志是"-";另一个是 tar 命令,工作号为 2,状态是暂停,标志是"+"。"+"号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。"-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"+-"标志了。

一旦当前的默认工作处理完成,则带减号的工作就会自动成为新的默认工作,换句话说,不管此时有多少正在运行的工作,任何时间都会有且仅有一个带加号的工作和一个带减号的工作。

 

补充


大家可能有这样的体验:某个程序运行的时候,会产生大量的log,但实际上我们只想让它跑一下而已,log暂时不需要或者后面才有需要。所以在这样的情况下,我们希望程序能够在后台进行,也就是说,在终端上我们看不到它所打出的log。为了实现这个需求,我们介绍以下几种方法。

我们以下面一个程序来模拟产生大量log的程序,这个程序每隔1秒就会打印一句“Hello world!”:

[root@www ~]# cat a.sh 
#!/bin/bash 
while ((1>0)) 
do
        echo "Hello world!"
        sleep 1s
done

现在,我们想要一个清静的世界,终端上不要有大量的log出现,我们要求程序在后台运行。

这种方法很简单,就是在命令之后加个“&”符号就可以了,如下:

[root@www ~]# ./a.sh &
[1] 92515
[root@www ~]# Hello world!
Hello world!
^C
[root@www ~]# Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

这样一来,程序就在后台运行了。但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但log依然不停的输出到当前终端。因此,要让终端彻底的清静,还应将log重定向到指定的文件:

[root@www ~]# ./a.sh &>>out.txt &
[1] 92580
[root@www ~]# cat out.txt 
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

2>&1是指将标准错误重定向到标准输出,于是标准错误和标准输出都重定向到指定的out.txt文件中,从此终端彻底清静了。

但是这样做要注意,如果Test程序需要从标准输入接收数据,它就会在那死等,不会再往下运行。所以需要从标准输入接收数据,那这种方法最好不要使用。

 

那现在程序在后台运行了,我们怎么找到它呢?很简单,有两种方法:

1. jobs命令

jobs命令可以查看当前有多少在后台运行。 

[root@www ~]# jobs -l
[1]+ 92580 Running                 ./a.sh &>>out.txt &

此命令可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。

2. ps命令

[root@www ~]# ps 
   PID TTY          TIME CMD
 91936 pts/2    00:00:00 bash
 92580 pts/2    00:00:00 a.sh
 92724 pts/2    00:00:00 sleep
 92725 pts/2    00:00:00 ps

[root@www ~]# kill -9 92580
[root@www ~]# ps
   PID TTY          TIME CMD
 91936 pts/2    00:00:00 bash
 92802 pts/2    00:00:00 ps
[1]+  Killed                  ./a.sh &>>out.txt