一、jobs
jobs
命令主要用于显示系统中的任务列表及其运行状态。
命令参数如下:
命令参数 | 参数含义 |
---|---|
-l | 显示作业列表时包括进程号 |
-n | 显示上次使用 jobs 命令后状态发生变化的作业 |
-p | 仅显示作业对应的进程号 |
-r | 仅显示运行中的作业 |
-s | 仅显示已暂停的作业 |
我们写一个死循环,依次执行三次并通过 Ctrl+Z
挂起,此时执行 jobs
命令,显示结果如下:
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ cat infinite_loop.c
#include <unistd.h>int main() {while(1) {sleep(1);}
}
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ gcc infinite_loop.c -o job1
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ gcc infinite_loop.c -o job2
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ gcc infinite_loop.c -o job3
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ ./job1
^Z
[1]+ Stopped ./job1
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ ./job2
^Z
[2]+ Stopped ./job2
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ ./job3 &
[3] 344854
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs
[1]- Stopped ./job1
[2]+ Stopped ./job2
[3] Running ./job3 &
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs -p
344771
344822
344854
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs -l
[1]- 344771 Stopped ./job1
[2]+ 344822 Stopped ./job2
[3] 344854 Running ./job3 &
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$
对于 jobs -l
命令,输出共五列:
- 作业号:可以通过在
fg
和bg
命令后面附加作业号操纵相应作业。 - 缺省标识符:
+
表示当前作业会被fg
和bg
命令当作缺省作业(即在不执行作业号的情况下fg
与bg
会缺省操作当前作业),-
表示当前作业将要成为缺省作业,一般情况下最后一个加入作业队列中的作业会被默认标记为缺省作业。 - 进程号:当前作业对应的进程号。
- 状态值:当前作业的运行状态。
- 作业名:当前作业对应的可执行文件名称。
二、fg 和 bg
fg
命令用于将作业(被挂起或者在后台运行的作业)放到前台运行。
bg
命令用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在运行命令后面添加符号 &
的效果是相同的,都是将其放到系统后台执行。
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs -l
[1]- 344771 Stopped ./job1
[2]+ 344822 Stopped ./job2
[3] 344854 Running ./job3 &
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ fg # 将缺省作业放到前台执行
./job2
^C
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs -l
[1]+ 344771 Stopped ./job1
[3]- 344854 Running ./job3 &
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ bg 1 # 将作业号为1的作业放到后台执行
[1]+ ./job1 &
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs -l
[1]- 344771 Running ./job1 &
[3]+ 344854 Running ./job3 &
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ fg
./job3
^C
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs -l
[1]+ 344771 Running ./job1 &
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ fg 1 # 将作业号为1的作业放到前台执行
./job1
^C
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$ jobs -l
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code$