前台和后台
$ gedit
运行这个命令将在前台打开一个 gedit,而终端不再返回。如果需要重新获得终端的控制权,有一个挂起的组合键 Ctrl-Z
,如下所示
^Z
[1] + 4761 suspended gedit
$
此时 gedit
的窗口仍然存在,但已经不再响应任何信息。这就是暂停的效果。
此外终端输出消息显示了 [1] + 4761 suspended
。这里的 1
为作业编号。运行
$ jobs -l # -l 参数表示列出进程的 PID
可以重新得到挂起的所有作业编号。此时可以运行
$ fg %1 # fg %gedit, fg %?ed
来重新运行 gedit
到 前台。如果直接输入 fg
表示重新启动最近停止的作业。
将 fg
替换为 bg
表示在 后台 重新运行。
‘&’
当需要直接运行一个作业到后台时,可以在命令后面附加一个 ‘&’ 符号,如下:
$ gedit &
[1] 5520
后台IO
用来启动后台应用程序的终端进程被称为 控制终端,如果没有被重定向那么这个后台作业的所有输出都会定向到控制终端。类似的,后台任务需要来自控制终端的输入。而控制终端无法将键入的任何字符定向到后台进程,因此该进程会被暂停,此时需要将该进程调到前台提供输入。
nohup
nohop
放在一个命令的前面,用于启动该命令,该命令忽略 hangup
信号并且将 stdout
和 stderr
附加到一个文件,这个文件默认为 nohup.out
。也可以通过 >
和 2>
重定向到别的地方。
$ echo "while sleep 30; do date;done" > pmc.sh # pmc.sh 将每 30s 输出时间
$ nohup sh pmc.sh &
[1] 6495
nohup: 忽略输入并把输出追加到"nohup.out"
$ nohup sh pmc.sh &
[3] 6523
nohup: 忽略输入并把输出追加到"nohup.out"
$ # 等待一段时间后
$ cat nohup.out
2018年 08月 14日 星期二 11:23:47 CST
2018年 08月 14日 星期二 11:24:17 CST
2018年 08月 14日 星期二 11:24:20 CST
2018年 08月 14日 星期二 11:24:47 CST
2018年 08月 14日 星期二 11:24:50 CST
这个命令即使注销终端也仍然会继续运行。
网友评论