中断执行并在终端中打印部分信息

时间:2013-11-10 21:18:35

标签: linux bash shell makefile ocaml

这个帖子大约是2个问题......

我的makefile的一部分如下:

list:       all
            while IFS= read -r f; \
            do \
                ./analyze $$f & \
            done < list.txt

list.txt包含文件名列表,然后make list遍历列表并将./analyze应用于每个文件。

我经常使用make list > output.txt将我打印的所有内容记录到stdout。在这种情况下,终端中没有显示任何内容。

但我刚才意识到我无法中断执行。我尝试了Ctrl+CCtrl+DCtrl+Z,然后PC看起来崩溃了,什么都做不了。

我之前意识到之前的原因是我在./analyze的呼叫周围有一个计时器。代码是

list:       all
            while IFS= read f; \
            do \
                ./analyze $$f & \
                PID=$$!; \
                (sleep 3; kill $$PID) & \
                wait $$PID; \
            done < list.txt
            sleep 3

然后,如果一个文件的调用花费超过3秒,它将被停止,下一个文件将被继续。在终端中,它显示的呼叫/bin/bash: line 8: kill: (2970) - No such process列表少于3秒,/bin/bash: line 9: 2973 Terminated ./analyze $f列表超过3秒。整个运行可以被Ctrl+C中断(尽管多次),输出可以写入output.txt

现在我意识到不再需要计时器了。所以我的问题是:

1)如果没有计时器或makefile的OCaml代码,我怎么能修改./analyze以便它可以被中断。

2)对于make list > output.txt,我怎样才能在执行过程中在终端中打印一些简单的信息,以便让我看到它的进展?

1 个答案:

答案 0 :(得分:1)

你需要摆脱那个&符号:

list:       all
            while IFS= read -r f; \
            do \
                ./analyze $$f & <--- *** THIS ONE ***
            done < list.txt

因为它告诉shell在后台启动analyze(并继续使用脚本)。这就是为什么你不能用ctrl-C中断analyze,也很可能也是为什么你不能重定向它的输出(make命令在你的analyze进程有机会写出输出之前终止)。