Managing Foreground Processes
前台程序的管理
Linux下的大部分命令都是运行在前台,命令通常会开始执行,然后会占用命令行,直到进程运行结束,进程可以允许在运行的过程中和用户进行交互,然后再推出,默认情况下所有的输出都会直接显示在终端
启动一个进程
默认情况下,进程都是前台启动的,除非这个进程退出,或者状态改变,否则在进程运行的时间内你是无法继续使用shell的(就是你执行了一个命令以后,你要等命令跑完了,提示符才能出现)
举个例子:
- echo “Hello World”
这个命令很简单,执行的也很迅速,瞬间就执行完了
但是其他有一些命令执行起来就比较耗时了,更有一些命令是会一直执行下去,直到我们去停止他
例如下面这个例子
- top
如果你不操作,这个命令会一直执行,当然,你按下‘q’的时候,TOP命令会退出
Terminating a Process 终止一个进程
看这么一个例子:
- while true; do echo “Hello World”; sleep 10; done
我们执行完这个命令以后,每隔10秒,屏幕就会打印一个”Hello World”,这次‘q’不好使了,我们必须要要给进程发送一个信号,linux系统中,linux kernel 可以给进程发送进程信号来控制进程的状态,一般情况下,CTRL-C 就是一个告诉进程该结束的信号
1 |
CTRL-C |
Suspending Processes 暂停进程
We mentioned above that foreground process will block access to the shell for the duration of their execution. What if we start a process in the foreground, but then realize that we need access to the terminal?
有些时候,我们可能执行了一个前台进程,突然我们又想使用shell了,而且不想等到进程结束,这个时候,我们就可以发送另外一个信号,CTRL-Z , 这次,linux内核就会告诉进程暂时挂起,并把shell交还给用户
举个例子:
- command ping -i 5 google.com
这个例子会每隔5秒ping一下google,这个时候你就发现我们无法使用shell,这个时候我按下:
1 2 |
CTRL-Z |
你一般会看到如下输出:
1 2 |
[1]+ Stopped ping -i 5 google.com |
这说明ping这个命令,临时挂起了,并且把shell 交给你使用了,如果想查看挂起的进程,使用命令:
- ps T
1 2 3 4 5 |
PID TTY STAT TIME COMMAND 26904 pts/3 Ss 0:00 /bin/bash 29633 pts/3 T 0:00 ping -i 5 google.com 29643 pts/3 R+ 0:00 ps t |
明显的看到STAT栏是T,表示被临时挂起
我们可以通过fg命令恢复被挂起的命令:
- fg
命令恢复以后,我们可以通过CTRL-C来结束
:
1 2 |
CTRL-C |
管理后台运行进程
后台程序是什么呢?后台程序和前台程序最大的区别就是我们一次只能执行一个前台程序,但是我们可以执行多个后台程序,并且允许用户继续使用shell(后台程序会被杀死当启动它的那个terminal推出的时候,但是通常情况下都不会,这是因为一个shell 的选项:huponexit 更多信息:https://linux.die.net/man/1/bash)
Starting Processes
我们可以通过再普通命令后添加‘&’来将一个普通命令变成后台运行的命令,这个时候这个命令的输出还是会输出到我们的屏幕上,但是这个时候我们是可以使用shell的,如果我们又执行了另外一个命令,输出会混在一起,除非,我们关闭输出输入与输出
举个例子:
- command ping -i 5 google.com &
输出:
1 2 |
[1] 4287 |
还有这些:
1 2 3 4 5 |
PING google.com (74.125.226.71) 56(84) bytes of data. 64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=1 ttl=55 time=12.3 ms 64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=2 ttl=55 time=11.1 ms 64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=3 ttl=55 time=9.98 ms |
但是这个时候我们是可以使用shell的,当然,输出结果很烦
Listing Background Processes 查询后台运行程序
使用命令jobs来查看所有后台运行程序:
- jobs
输出结果:
1 2 |
[1]+ Running command ping -i 5 google.com & |
前边的序号很重要,是用来管理的key
Stopping Background Processes终止后台运行程序
我们有好几种方法关闭后台运行程序,最直接的方法,使用kill命令,例如:
- kill %1
结果:
1 2 |
[1]+ Terminated command ping -i 5 google.com |
修改进程状态
Now that we know how to start and stop processes in the background, we can talk about how to change their state.
我们已经知道如何启动和终止后台进程的状态了,下面我们来看如何修改进程的状态:
将前台程序强制变更为后台程序
If we forget to end a command with &
when we start it, we can still move the process to the background.
有时候我们已经开始执行了才发现我们忘记加&了,这个时候,第一步,我们先要挂起它,我们可以通过命令
1 2 |
CTRL-Z |
进程停止后,我们可以通过bg来重新启动他(在后台)
- bg
这个时候你就会发现‘&’已经添加了
1 2 |
[1]+ ping -i 5 google.com & |
将后台程序转换为前台程序
我们可以通过命令fg来讲后台程序转换成前台
:
- fg
指定某个后台任务(就是上边的key):
- fg %2
原文地址:
https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021
广州网站建设 2018/08/14 10:02
不错