我有一个程序,我们称之为xcommand
。当它运行时,它没有标准输出,但它将输出写入文件。
我想要实现的是这样的:运行后xcommand
,在运行过程中我想实时看到它的输出,如果发现异常,我就关闭输出,同时恢复xcommand
。
我尝试了几种方法,例如在我编写的bash脚本中
xcommand &
tail -f outputfile
fg
然而,问题是一旦我按下ctrl+c
,整个事情就停止了。并且fg
根本没有运行。
那么是否可以达到我想要的效果呢?
答案1
当非交互时(如在脚本中),shell 不进行作业控制。他们不会将异步作业置于后台。它们与脚本的其余部分保留在同一进程组中,因此 Ctrl-C 也会导致向它们发送 SIGINT(假设脚本本身在前台启动)。
您可以发出命令set -m
让 shell 在非交互时进行作业控制:
#! /bin/bash -
set -m
xcommand & # start as a background job, so won't receive SIGINT upon ^C
tail -f outputfile # start in foreground. Will receive SIGINT.
fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT
为了使其工作,该脚本必须在前台启动。另请注意,如果您按 Ctrl-Z 或者后台作业尝试从终端读取数据,您将会遇到麻烦。
根据我的经验,这种技巧只有“作品”在bash
或中yash
,通常不是其他类似 Bourne 的 shell。
答案2
如果您在后台启动程序
xcommand &
按下Ctrl+C外壳将不是停下来。
如果你那么做
tail -f outputfile
然后按Ctrl+C,tail
只会终止该进程。
如果你那么做
fg
你将把它放在xcommand
前台。现在,按下Ctrl+C将终止该xcommand
过程。
因此,请勿将xcommand
进程置于前台,或者,如果这样做,请按Ctrl+Z并跟进bg
将其放回后台。