Linux 进程前后台切换

工作控制

工作控制是一种由内核支持、shell 实现的功能,允许用户同时运行多个进程,其中一个进程在前台(foreground),其他进程在后台(background)运行。用户可以在前台和后台之间切换、挂起和显示进程状态。

将一个进程放入后台运行,该进程必须不需要与用户交互,且不能使用 Ctrl+c 来终止运行。

后台运行

在命令后加入空格和&符号即可将进程放入后台运行,这也被称为异步进程(Asynchronous Process)运行程序:

[root@101c7 ext333]$ tar -zxvf 1.iso -C lost+found/ &
[1] 36961

中括号内的数字为工作号码(job number),后续数字为工作在系统中的 PID。

后台工作完成后会给前台发信息:

[1]+  Done                    cp -i 1.iso 1.copy

后台运行的工作如果有标准输出(stdout)和标准错误输出(stderr),依然会实时输出到屏幕。可以在执行时将这些数据重定向,以免影响前台工作。

后台暂停

使用 Ctrl+z 把当前的前台工作停止放到后台:

[root@101c7 ~]$ tail -f root.txt 
-rw-r--r--.  1 root root         0 Sep 11 10:11 list_error.txt
-rw-r--r--.  1 root root        54 Sep 11 10:16 list.txt
^Z
[2]+  Stopped                 tail -f root.txt

数字 2 表示这是后台中的第 2 个工作,加号 + 代表最近一个被丢进后台的工作。

后台状态

使用 jobs 命令查看当前后台工作状态。可用参数如下:

参数 说明
-l 除了列出 job number 与命令外,同时列出 PID
-r 仅列出后台运行的工作
-s 仅列出后台暂停的工作

使用 -l 参数查看当前后台工作状态与工作 PID:

[root@101c7 ~]$ jobs -l
[1]- 37687 Stopped                 tail -f root1.txt
[2]+ 37698 Stopped                 tail -f root.txt
[3]  37916 Running                 tail -f list_error.txt &

加号 + 代表最近一个被放置到后台的工作,减号 - 代表倒数第二个被放置到后台中的工作,其他工作没有符号。

后台转前台

使用 fg 命令将后台工作转到前台处理。例如将 3 号工作取出到前台:

[root@101c7 ~]$ fg %3
tail -f list_error.txt

后台转运行

使用 bg 命令启动后台暂停中工作为后台运行。例如将后台暂停的 3 号工作转为后台运行:

[root@101c7 ~]$ bg $3
[3]+ tail -f list_error.txt &

脱机运行

由于登陆后在 shell 中运行的命令父进程是 bash,所以当 shell 会话中断时,后台的程序也会跟着被中断。

想要保持程序一直运行与终端状态脱离关系,可以使用 nohup 命令来处理。命令格式为:nohup [命令与参数] &

例如保持 sh13.sh 脚本脱机运行:

[root@101c7 bin]$ nohup ./sh13.sh &
[1] 40062

注销用户后重新登录,使用ps命令查询:

[root@101c7 ~]$ ps aux | grep sh13
root      40062  0.0  0.0 113284  1184 ?        S    03:53   0:00 /bin/bash ./sh13.sh
root      40219  0.0  0.0 112812   968 pts/0    S+   03:55   0:00 grep --color=auto sh13

可以看到程序(PID=40062)依然在运行中,可以使用 kill 命令来终止运行。

程序的输出会被重定向到 ~/nohup.out 文件。也可以手动指定 1>2> 到其他文件。