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>
到其他文件。