在中间步骤中发送 ctrl+c 后是否可以保持命令序列运行?

在中间步骤中发送 ctrl+c 后是否可以保持命令序列运行?

我有一个程序,我们称之为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+Ctail只会终止该进程。

如果你那么做

fg

你将把它放在xcommand前台。现在,按下Ctrl+C将终止该xcommand过程。

因此,请勿将xcommand进程置于前台,或者,如果这样做,请按Ctrl+Z并跟进bg将其放回后台。

相关内容